Javascript 使用Ajax真实性令牌从Rails中的Index.js.erb渲染到Index.html.erb时出现问题

Javascript 使用Ajax真实性令牌从Rails中的Index.js.erb渲染到Index.html.erb时出现问题,javascript,jquery,ruby-on-rails,ruby,erb,Javascript,Jquery,Ruby On Rails,Ruby,Erb,基本上,我在Index.html.erb上的Rails中显示了一个TODOAPP页面,我试图通过Index.js.erb呈现实例化的TODO对象,因为每个对象都附加了一个表单,需要Rails助手提供一个真实性令牌。通过/在Javascript中呈现TODO是必要的 我的解决方案是通过在索引中设置render“Index.js.erb”并调用一个partial,然后在ruby中呈现并运行('),尝试将todo附加到Index.html.erb视图中。然而,这需要一个_索引部分,而仅仅尝试直接在in

基本上,我在Index.html.erb上的Rails中显示了一个TODOAPP页面,我试图通过Index.js.erb呈现实例化的TODO对象,因为每个对象都附加了一个表单,需要Rails助手提供一个真实性令牌。通过/在Javascript中呈现TODO是必要的

我的解决方案是通过在索引中设置render“Index.js.erb”并调用一个partial,然后在ruby中呈现并运行('),尝试将todo附加到Index.html.erb视图中。然而,这需要一个_索引部分,而仅仅尝试直接在index.js.erb中追加甚至运行任何内容实际上会导致该页面本身被呈现

当然,我知道这是一个路由问题,但我无论如何也找不到通过/在JS中将TODO对象呈现给DOM,并将真实性令牌包含在它们包装的表单中,因为通过.JS文件中的jquery在DOM中附加表单将不允许包含令牌

我真的很感激你可能有任何见解,因为我已经用尽了在线搜索和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回购协议是:


非常感谢您的任何见解

我找到了一种从这篇文章的版面标题中获取真实性标记的方法,但是js.erb上的路由和渲染仍然不起作用。

相反,你可以让它以html格式呈现什么,让它像平常一样呈现你的视图,这样,
index.js.erb
将被呈现为“正常”,json格式将包含您的@TODO,如:

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令牌:

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

我最初尝试过,它适用于对索引的AJAX调用,但我需要一种方法将这些对象(或rails对象)部分通过ERB附加到DOM,因为这是唯一允许我自动生成真实性令牌的方法。我想我有一个可行的解决办法,通过布局元标记,但我无法让index.js.erb运行。除了.html.erb,你在哪里面临令牌的问题?我尝试创建和编辑todo,它成功了,唯一不起作用的是PUT请求。对于PUT基本上是。因为我将要向TODO添加一个类似于strike-through函数的函数,并且需要发出put请求。它在功能上是有效的,但是令牌没有显示在参数中,所以我担心安全问题或bug,
$(文档)在(“单击“,”.toggle”,函数(e){…}上做了什么
line怎么办?那行不行,我得稍微调整一下。