无法使用 Ajax 真实性令牌从 Rails 中的 Index.js.erb 渲染到 Index.html.erb

Trouble rendering to Index.html.erb from Index.js.erb in Rails Using Ajax Authenticity Token

基本上,我在 Index.html.erb 上的 Rails 中显示了一个单独的页面 TODOAPP,我试图通过 index.js.erb 呈现实例化的 TODO 对象,因为它们有一个表单附加到他们每个人需要来自 rails 助手的真实性令牌。呈现 TODO through/in Javascript 是必要的。

我的解决方案是通过在索引中设置 render "index.js.erb" 并调用将在 ruby 中呈现然后 运行 ('<%= j 渲染 'index.html.erb' %>).但是,这需要一个 _index 部分,并且只是尝试直接在 index.js.erb 中附加甚至 运行 任何内容实际上会导致该页面本身被呈现。

当然,我知道这是一个路由问题,但我还是找不到将 TODO 对象呈现给 DOM through/in JS 并以它们的形式包含真实性令牌'被包裹起来,因为在 .js 文件的 dom 到 jquery 中附加表单将不允许包含令牌。

非常感谢您提供任何可能的见解,因为此时我已经用尽了在线搜索和 YouTube 视频。我的索引控制器操作是:

def index
  @todo = Todo.new
  @todos = Todo.all
  respond_to do |format|
    format.html { render 'index.js.erb' }
    format.json { render :json => @todos  }
    format.js { render 'form.js.erb' }
  end
end   

GITHUB 回购是:https://github.com/jwolfe890/todoapp/blob/master/app/assets/javascripts/todo.js

非常感谢您的任何见解!

我找到了一种方法,可以从 post POST request done with Authenticity Token, but exception still rased 的布局 header 中获取真实性令牌,但是 js.erb 上的路由和渲染仍然没有正在工作。

而不是告诉以 html 格式呈现的内容,您可以让它按照正常方式呈现您的视图,这样,index.js.erb 将呈现为 "normally",并且json 格式会有你的@todos,比如:

def index
  @todo = Todo.new
  @todos = Todo.all
  respond_to do |format|
    format.html {  }
    format.json { render json: @todos  }
    format.js   {  }
  end
end

并且为了在每次发出请求时重新生成令牌,您可以使用 after_action 回调,例如:

after_action :add_csrf_token_to_json_requests

private

def add_csrf_token_to_json_requests
  if request.xhr? && !request.get? && protect_against_forgery?
    response.headers['X-CSRF-Token'] = form_authenticity_token
  end
end

并且在您的 application.js 中每次 ajax 请求完成时设置 csrf-token:

$(document).ajaxComplete(function(event, xhr,settings) {
  header_token = xhr.getResponseHeader('X-CSRF-Token');
  if (header_token) $('meta[name=csrf-token]').attr('content', header_token)
});