2017-08-12 46 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