2017-08-12 3 views
2

基本的に、私はIndex.html.erbのRailsに表示される1ページのTODOAPPを持っています。それらがそれぞれレールアシスタントからの信頼性トークンを必要とするフォームを持っているので、index.js.erbを介してTODOオブジェクトをインスタンス化します。 TODOをJavascriptで/からレンダリングする必要があります。Ajax Authenticity Tokenを使用して、RailsのIndex.js.erbからIndex.html.erbへのレンダリングに問題があります。

私の解決策は、Index.html.erbビューにtodosを追加することでした。インデックスのレンダリング "index.js.erb"を設定し、ルビーでレンダリングしてから実行する部分を呼び出しました( '< %= j render 'index.html.erb'%>)。しかし、これは_indexの部分的な部分を予期し、index.js.erbに直接何かを追加または実行しようとすると、そのページ自体がレンダリングされます。

もちろん、これはルーティングの問題だと私は理解していますが、TODOオブジェクトをJSを介して/から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

は、任意の洞察力のために非常にありがとうございます!

答えて

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トークン毎回AJAXを設定しますリクエストが完了しました:

$(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呼び出しのために動作しますが、それは私ができるようになる唯一の方法ですので、私は部分的にERBを通じてDOMにそれらのオブジェクト(またはオブジェクトをレール)を追加する方法が必要です真正性トークンを自動的に生成する。私はレイアウトメタタグを通して実行可能な回避策があると思うが、私は.html.erbに加えてindex.js.erbを走らせることができない。 – Dog

+0

あなたはどこでトークンの問題に直面していますか? todoを編集してそれがうまくいけば、PUTリクエストだけが動作しませんでした。 –

+0

基本的にはput。私はTODOに機能を追加してストライクのように追加し、put要求を行う必要があるためです。 – Dog

関連する問題