Обновление DIV после отправки формы в ruby ​​на рельсах - PullRequest
1 голос
/ 07 августа 2009

У меня есть контроллер и представление (для этого нет ActiveRecord). Контроллер рассчитывает текущее время в нескольких точках мира, и представление их отображает.

Я бы хотел добавить кнопку, которая будет обновлять часы. Добавление обычной кнопки, которая обновляет всю страницу, работает нормально, но я бы хотел сделать это асинхронно, используя AJAX. Я пытался использовать form_remote_tag, но потом ничего не происходит, потому что ничего не обновляется ...

Как мне это сделать?

(Кстати, я делаю это для изучения рельсов. Нет реальной необходимости или требования)

Мой код: Контроллер интересная часть:

def index
  utc_time = Time.now.getutc
  @clocks = []
  @clocks << ["USA - New York", utc_time - 60*60*5]
  @clocks << ["England - London", utc_time]
end

Вид интересной части:

<%= javascript_include_tag 'prototype' %>

<div id="clocks_div">
<% @clocks.each do |city, time| %>
  <b><%=h city %></b>: <%=h get_formatted_time(time) %>
<br/>
<% end %>
</div>
<br/>

<% form_remote_tag do %>
    <%= submit_tag "Refresh!" %>
<% end %>

Спасибо за помощь

Ответы [ 3 ]

1 голос
/ 07 августа 2009

Переместите содержимое clocks_div в его собственную часть (но не в сам div). Затем на странице указателя вы можете использовать link_to_remote, button_to_remote или даже periodical_call_remote для обновления div.

Итак:

<% periodically_call_remote :update => "clocks_div", :url => { :action => :refresh } %>

или

<%= button_to_remote "Refresh", :url => { :action => :refresh }, :update => "clocks_div" %>

Затем в вашем контроллере сделайте что-то вроде: (я добавил здесь рефакторинг)

def get_clocks
  utc_time = Time.now.getutc
  clocks = []
  clocks << ["USA - New York", utc_time - 60*60*5]
  clocks << ["England - London", utc_time]
  clocks
end
private :get_clocks

def index
  @clocks = get_clocks
  # Renders the full index page by default
end

def refresh
  render :partial => "clocks", :layout => false, :locals => { :clocks => get_clocks }
  # Renders only the clocks partial with the clock values
end
0 голосов
/ 15 декабря 2009

Если вам не нужно обновление на стороне просмотра, вы можете сделать это со стороны действия, выполнив обновление

Например.

render: update do | page |
страница [: clocks_div] .innerHTML = визуализация: частичная => "controls / tag_list"
конец

0 голосов
/ 07 августа 2009

Я думаю, вы должны передать form_remote_view имя div, которое вы хотите обновить, и действие / контроллер, который вы хотите использовать. Попробуйте что-то вроде этого:

<% unless params.has_key? "refresh" %>
 <% form_remote_tag :update => "clocks_div", :url => { :action => :index } do %>
  <%= hidden_field_tag 'refresh' %>
  <%= submit_tag "Refresh!" %>
 <% end %>
<% end %>

ПРИМЕЧАНИЕ: Хотя это должно сработать, может быть удобно переместить шаблон для clocks_div в частичный и отобразить его с помощью отдельного действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...