2012-02-02 10 views
0

Ruby on Railsの新機能です。私はO'Reilly Head First Railsの書籍でいくつかのサンプルアプリケーションを使っています。例の1つでは、3つの部分からなるページがあります。中間の部分は項目のリストです。このセクションのすぐ下にリンクがあり、クリックするとその部分を含むdivが更新されるはずです。この本は、Rails 2.3に基づいた例を実行していると私は信じて、私はRails 3.1を使用しています。Ruby on Rails 3:AJAXコールでdivをlink_toでリフレッシュしない

routes.rbを::

map.connect '/flights/:flight_id/seats', :action=>'flight_seats', :controller=>'seats' 

seats_controller.rb:

def flight_seats 
    @flight = Flight.find(params[:flight_id]) 
    render :partial => "flights/seat_list", :locals => {:seats => @flight.seats} 
end 

show.html.erb:

<div id="seats"> 
    <%= render :partial=>"seat_list". :locals=>{:seats=>@flight.seats} %> 
</div> 

<$= link_to_remote("Refresh Seats", :url=>"/flights/#{@flight.id}/seats", method=>"get", :update=>"seats") %> 

これは本は私を与えているという例ですこの例では、prototype.jsも使用しています。これは、Rails 2.3に組み込まれているもので、Rails 3にはデフォルトのJavaScriptとしてjQueryが組み込まれていますとしょうかん。 (それが大きな違いになるかどうかは分かりません)

ここまでは私がこれまで持っているものです。これはパーツの内容を正しく取得していますが、AJAX呼び出しが部分的に取得された後は "seat" divを更新していないだけです。私のコード:

routes.rbを:

match 'flights/:flight_id/seats' => 'seats#flights_seats' 

seats_controller.rbは:

def flights_seats 
    @flight = Flight.find(params[:flight_id]) 

    render :partial => "flights/seat_list", :locals => { :seats => @flight.seats } 
end 

show.html.erb:

<div id="seats"> 
    <%= render :partial => 'seat_list', :locals => { :seats => @flight.seats } %> 
</div> 

<%= link_to "Refresh Seats", "/flights/#{@flight.id}/seats", :remote => true %> 

任意のアイデアは、なぜ私の<div id="seats">はしません更新された部分をリフレッシュしますか?私はそこに賭けているが、とにかく私は尋ねるだろう、私のコードで何か間違っていますか?

+0

':更新は=>「席」'しませんがjQueryで作業します。 AJAXレスポンスを処理するにはJavaScriptを書く必要があります。 Rails3/jQuery/AJAXには多くの例があります。 –

+1

Ok: ':update'ではなく、独自のカスタムJavaScriptを記述してレスポンスを処理する必要がありますか? ':update'がRails 3で廃止された理由は何ですか?私は理由があると仮定しています。 – ryanpitts1

+1

はい、あなた自身のJavaScriptを書く必要がありますが、それは簡単です。これは、インラインのjavascriptやビューの脆弱なコードを避けるために行われました。 –

答えて

2

JSONデータを返さない場合、:remote => trueオプションはちょっと変わっています。しかし、JSONオブジェクトにHTMLをラップすることはできますが、これは通常私が行うことです。それとも、このような何かがあなたのために働く必要があり、既存のコードに近い何かをしたい場合:どこかJavaScriptで

<%= link_to "Refresh Seats", "/flights/#{@flight.id}/seats", :class => "refresh-seats" %>

$(document).delegate(".refresh-seats", "click", function(e){ 
    e.preventDefault(); 
    $("#seats").load(this.href); 
}); 
+0

それは素晴らしい作品です!サンプルコードをありがとう。しかし、1つのマイナーな欠陥があった。 ;)あなたはあなたのセレクタの '' seat 'の前に '#'を忘れました。助けてくれてありがとう....私は、Rails 3+で変更されたことがたくさんあることを知っています。 – ryanpitts1

+1

クール、私はうまく働いてうれしく、私は構文エラーを修正するために私の答えを更新しました。 –

関連する問題