Rails表单和对不同控制器的自定义Ajax调用
Rails Forms and Custom Ajax Calls to a Different Controller
我有3个模型,通道,标签然后是通道标签,它们有一个有多个通过关系设置如下:
通道模型
has_many :tags, :through => :channel_tags, :dependent => :destroy
has_many :channel_tags, :dependent => :destroy
<<p> 标记模型/strong> has_many :channel_tags, :dependent => :destroy
has_many :channels, :through => :channel_tags, :dependent => :destroy
通道标签模型
belongs_to :channel
belongs_to :tag
在我的编辑频道表单上,我有一个文本输入供用户输入标签,然后是一个自定义js插件,该插件对数据库进行ajax调用,以检查与搜索匹配的现有标签,如果没有找到结果,用户可以将搜索词添加为新标签,这是任何博客平台的经典功能。但是,我在添加新标签时遇到了一些问题。我有以下JS做一个帖子:
var name = _ts.$input.val(),
auth_token = $('input[name="authenticity_token"]').val();
$.post('/tags/?&authenticity_token=' + auth_token, { name : name }, function(data) {
console.log(data);
});
当我第一次这样做的时候,我得到的错误是它是一个无效的authenticity_token,我假设这是因为它是因为代码是一个编辑通道形式,而不是一个新的标签形式。我看到有人建议在标签控制器中添加以下内容:
protect_from_forgery with: :null_session
那工作,虽然我不确定这是最好的解决方案?
但是现在我得到一个400错误说:
ActionController::ParameterMissing in TagsController#create
param is missing or the value is empty: tag
我很有信心这是因为我的标签控制器中有以下内容:
def tag_params
params.require(:tag).permit(:name,
:slug
)
end
我不确定如何围绕它工作?是否有一个特殊的方法与自定义JS与rails交互?我已经阅读了关于使用form_for远程的文档,但这并不适用于我想做的事情。
任何建议或指导将不胜感激!!多谢大卫。
首先,您应该从meta
标记(从header)获得您的真实性令牌,而不是从隐藏的输入,因为令牌始终存在于header中。然后您应该设置AJAX调用,以便X-CSRF-Token
头将与您的所有请求一起发送:
$.ajaxSetup({
beforeSend: function(xhr) {
var token = $('meta[name="csrftoken"]').attr('content');
xhr.setRequestHeader('X-CSRF-Token', token);
}
});
现在可以保留原来的protect_from_forgery
方法。我不认为在这里使用protect_from_forgery with: :null_session
是个好主意。然后,您应该实现其他授权机制。
关于你的参数,根据要求:
$.post('/tags', { name : name }, function(data) {
console.log(data);
});
TagsController#create
接收到的参数将是{name: 'tag name'}
。所以params.require(:tag)
肯定是缺失的。你应该使用;params.permit(:name)
代替。但是,我认为,这是更好的,遵循Rails的默认值,改变你的AJAX调用代替:
$.post('/tags', { tag: { name : name } }, function(data) {
console.log(data);
});
- 如何使用自定义标头跨域执行AJAX POST
- 自定义筛选器不'我不使用django数据表视图创建的ajax.data.Json
- 自定义AJAX数据类型
- Rails 4:形成远程自定义 ajax 请求
- 使用自定义 ajax 请求渲染 js 部分(而不是远程:true)
- 自定义 ajax 调用以 & 符号.js
- Magento :自定义 Ajax 调用下拉列表更改
- 如何在wordpress中制作自定义ajax处理程序
- 自定义Ajax文件上传程序,.AjaxSubmit()问题
- 使用AJAX上传自定义AJAX文件上传程序
- 如何正确实现自定义ajax
- Jqgrid自定义ajax请求
- Rails表单和对不同控制器的自定义Ajax调用
- 使用jQuery表单验证自定义Ajax请求
- 为多个页面定义和调用自定义AJAX函数无法工作
- jQuery+JavaScript:使用单个对象作为参数创建自定义ajax调用函数
- AngularJs服务中的自定义AJAX属性
- Rails中自定义AJAX的最佳实践
- 自定义AJAX服务器
- 如何完全重置自定义AJAX对象