2017-08-12 25 views
2

基本上,我有一个单独的页面TODOAPP,它显示在Index.html.erb的Rails中,我试图呈现通过index.js.erb实例化TODO对象,因为它们具有附加到每个需要来自Rails帮助器的真实性令牌的表单。通过/以Javascript呈现TODO是必要的。在使用Ajax真实性标记的Rails中从Index.js.erb向Index.html.erb呈现问题

我的解决方案是尝试通过在索引中设置渲染“index.js.erb”并调用一个部分,然后在红宝石中渲染,然后运行('<),将索引附加到Index.html.erb视图%= j呈现'index.html.erb'%>)。然而,这期望一个_index部分,只是试图追加甚至直接在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库是:https://github.com/jwolfe890/todoapp/blob/master/app/assets/javascripts/todo.js

谢谢你无比的任何见解!

回答

2

取而代之的是告诉用html格式渲染什么,你可以让它像往常一样渲染你的视图,这样,index.js.erb就会呈现为“正常”,而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设置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) 
}); 
+0

我想,最初,它工作的AJAX调用索引,但我需要一种方法来添加这些对象(或滑轨对象)到DOM部分通过再培训局,因为这是可以让我的唯一途径自动生成真实性标记。我想我有一个可行的解决方法,通过布局元标记,但我不能得到index.js.erb运行除.html.erb – Dog

+0

你在哪里面临的问题与令牌?,我试图创建和编辑待办事项,它的工作,唯一不起作用的是PUT请求。 –

+0

基本上放。因为它会像TODO一样通过功能添加,并且需要提出请求。 – Dog