我有两个带有选项remote: true
的表单;一个向create
动作发送Ajax请求,另一个向destroy
动作发送Ajax请求。
启用JavaScript后所有工作罚款,但如果我禁用JavaScript,那么我点击,我收到此错误:
ActionController::InvalidAuthenticityToken PersonsController#create
为什么显示此错误,我该如何解决?
注意:我使用的是Rails 4
当我使用不带选项remote: true
的普通表单时,rails会自动为身份验证令牌插入一个隐藏字段,但是当我在表单中使用remote: true
时,HTML代码中没有这样的字段。似乎有remote
选项时,Rails会以不同的方式处理身份验证令牌,那么我如何才能在两种情况下都能使用它?
答案 0 :(得分:113)
奇怪的是,这种行为在rails 4中发生了变化。http://www.alfajango.com/blog/rails-4-whats-new/
Rails表单现在不会在表单中呈现CSRF字段,除非您明确将其定义为表单的选项:
<%= form_for @some_model, :remote => true, :authenticity_token => true do |f| %>
<% end %>
如果关闭Javascript,添加此选项可以优雅地降级为HTML回退。
答案 1 :(得分:28)
我也遇到了同样的问题。我使用form_tag创建自定义远程表单,但我收到以下错误,
ActionController::InvalidAuthenticityToken
我发现这是因为在轨道4中默认情况下不会添加真实性,所以我在application.rb文件中添加了以下行,
config.action_view.embed_authenticity_token_in_remote_forms = true
在提交远程表单时自动验证toke。这解决了我的问题。希望这会对某人有所帮助。
答案 2 :(得分:4)
在我的情况下,我只需在我的页面中添加此行:
<%= csrf_meta_tags %>
答案 3 :(得分:1)
如果表单中没有csrf字段(隐藏字段),则Rails服务器无法对提交进行身份验证。
如果您按form_tag
制作表单,则会出现这种情况。更好的方法是使用form_for
作为资源(db中的新对象或现有对象),并且Rs自动构建csrf字段。