Ruby on Rails 3: вызов AJAX не обновляет div с помощью link_to - PullRequest
0 голосов
/ 02 февраля 2012

Я новичок в Ruby on Rails и работаю с несколькими примерами приложений из книги O'Reilly Head First Rails.В одном из примеров есть страница, состоящая из трех частей.Средняя часть - это список предметов.Прямо под этим разделом есть ссылка, которая при щелчке должна обновить элемент div, содержащий эту часть.В книге приводятся примеры, основанные на Rails 2.3. Я верю и использую Rails 3.1.Вот пример, который дает мне книга:

rout.rb:

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

seat_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 jQuery используется в качестве библиотеки JavaScript по умолчанию.(не уверен, что это имеет большое значение)

Вот что у меня есть.Это правильно получает содержимое части, просто не обновляет div "seat" после того, как вызов AJAX получает часть.Мой код:

rout.rb:

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

seat_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"> не обновится с обновленным частичным?Держу пари, что есть, но я все равно спрошу, что-то не так с моим кодом?

1 Ответ

2 голосов
/ 03 февраля 2012

Параметр: remote => true немного странный, если вы не возвращаете данные JSON. Вы можете обернуть ваш HTML в объект JSON, что я обычно и делаю. Или, если вы хотите что-то более близкое к существующему коду, что-то вроде этого должно работать для вас:

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

В вашем JavaScript где-то:

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