2012-01-26 5 views
8

古いレールアプリを3.1にアップグレードします。このアプリはかなり機能していますが、更新する必要があるいくつかのAjax機能があります。 (違いがあれば私はjqueryとcoffeescriptを使用しています)Railsを3.1にアップグレード - ajaxの処理を「render:update」からrespond_toに変更する

既存のajax機能はすべて、render:updatesを使って書かれています。例:

render :update do |page| 
    page.remove "financial_tran_offset_#{params[:ftof_id]}" 
    page.replace_html 'details', :partial => 'details', :locals => {:obj => @fire} 
end 

私はこれを行う新しい方法がrespond_toを使用すると思いますか? jsを処理するためにブロックしますが、これらの異なるケースを処理する最良の方法についてはわかりません。

最初のケース(page.remove)私はアセットパイプラインでは、/ app/assets/javascripts/javascript側(たとえばpage.remove)を処理する外部jsが必要ですが、パラメータをjsファイルに渡す方法が不明です。私はあなたが何かを行うことができます推測している:

respond_to do |format| 
    format.js {:render :js => {:ftof => params[:ftof_id]} 
end 

を私はあなたが、JSファイル内からこれを拾うことができるかわかりません。これはjsに情報を渡すこの正しい方法ですか?それとも、私が使用すべき別の方法がありますか?

第2の場合(page.replace_html)、これは廃止されました(3.1から削除されました)(apidock)。私は再びアプリケーション/資産/ javascriptディレクトリ内のjsファイルを使用する必要がありますが、部分をレンダリングしてjsにこの情報を渡す方法についてはわからないと思います。この領域での任意のポインタのための

感謝=)

答えて

31

js.erbビューとrespond_toブロックと組み合わせてのjQueryを使用してください。

このアクションは(私たちは、例示のためFoosController#updateを言うよ)であるものは何でも:

render :update do |page| 
    page.remove "financial_tran_offset_#{params[:ftof_id]}" 
    page.replace_html 'details', :partial => 'details', :locals => {:obj => @fire} 
end 

はなる:

respond_to do |format| 
    format.html 
    format.js  # <- this is what we're after 
end 

ビューファイルupdate.js.erbで:

$('#financial_tran_offset_<%= params[:ftof_id] %>').remove(); 
$('#details').replaceWith('<%= escape_javascript(render(:partial => 'details', :locals => {:obj => @fire})) %>'); 

update.js.erbはERbによって解析され、JSとしてレンダリングされ、clienに送り返されますt経由でAjaxとevalされます。

これらのJSテンプレートに任意のものを渡すことができます。結局のところ、それらはERbファイルです。 HTML/ERbビューと同様に<%= %>とインスタンス変数を使用してください。 JS/ERbビューでrenderを呼び出す場合は、escape_javascriptで囲んでHTMLを正しくレンダリングしてください。

プロトタイプの古い JavaScriptGeneratorヘルパーメソッドを呼び出します render :update

。 jQueryへの変換は、DOM要素を選択して操作するという同じことを行うので、非常に簡単です。

ここには、典型的な操作を備えた、ちょっとした翻訳テーブルがあります。コントローラからプロトタイプヘルパーメソッドを削除し、対応するJS /のerbビューで自分のjQueryやJSの対応を置く:

 Prototype       jQuery/Javascript 
    in controller     in JS/ERb view (xxxxxx.js.erb) 
     ---------       ----------------- 
page.alert "message"     alert('message'); 
page.hide "id"      $('#id').hide(); 
page.insert_html \ 
     :top, "id", "content" $('#id').prepend('content'); 
     :bottom, "id", "content" $('#id').append('content'); 
     :before, "id", "content" $('#id').before('content'); 
     :after, "id", "content" $('#id').after('content'); 
page.redirect_to "url"    window.location.href = 'url'; 
page.reload       window.location.reload(); 
page.remove "id"      $('#id').remove(); 
page.replace "id", "content"   $('#id').replaceWith('content'); 
page.replace_html "id", "content" $('#id').html('content'); 
page.show "id"      $('#id').show(); 
page.toggle "id"      $('#id').toggle(); 

はそれぞれ、すべての行にセミコロンを忘れないでください!

+0

cool。とにかくcoffeescriptでこれを行うには、またはあなたはupdate.js.erbのまっすぐなjsに限られていますか? –

+0

あなたが本当にCoffeeScriptを使いたいのであれば、可能かもしれませんが、動的なビューでは私が知ることができないほどまれです。 (私は個人的にストレートJSを好んでいます。)単純なjQueryワンライナーのCoffeeScriptはちょっと大げさです。 $( '#id')。append 'content''。$('#id ')。一組の括弧を保存することはオーバーヘッドに値するものではありません。 JQueryはコンパクトでシンプルです。それにこだわるかもしれない。 – Substantial

+0

非常に詳細な答えをありがとう! –

関連する問題