在ruby on rails上提交表单后刷新DIV

时间:2009-08-07 08:15:55

标签: ruby-on-rails ruby

我有一个控制器和一个视图(这个没有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 个答案:

答案 0 :(得分:1)

将clocks_div的内容移动到它自己的partial(但不是div本身)。然后在索引页面中,您可以使用link_to_remote,button_to_remote,甚至periodic_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

答案 1 :(得分:0)

我认为您必须将 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的模板移动到partial并通过单独的操作呈现它可能会很方便

答案 2 :(得分:0)

如果你不想要视图侧更新,你可以从动作端到渲染更新

例如

渲染:更新do | page |
         page [:clocks_div] .innerHTML = render:partial =&gt; “控制/ tag_list”