具有多种形式的 CSRF 令牌

CSRF token with multiple forms

我在一个页面上有两个表单,它们都是这样声明的:

form_for @student, {remote:true, format: 'json'} do |f|

form_for @teacher, {remote:true, format: 'json'} do |f|

但是,当我单击 teacher 表单的提交按钮时,它出错了,为该请求说 "Invalid CRSF token"。 student 表单的请求工作正常。

我在 application.html.erb 主文件中有 <%= csrf_meta_tags %>,并且 teacher 表单在提交中确实有一个 CSRF 令牌。我没有做 API,我只是希望通过 AJAX 处理表单(我做了一些客户端错误处理和确认)。

根据 Rails 文档,您需要为 json 请求禁用 CSRF 保护:http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html

It's important to remember that XML or JSON requests are also affected and if you're building an API you'll need something like:

class ApplicationController < ActionController::Base
  protect_from_forgery
  skip_before_action :verify_authenticity_token, if: :json_request?

  protected

  def json_request?
    request.format.json?
  end
end

另请参阅: