我有一个控制器和一个视图(这个没有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 %>
感谢您的帮助
答案 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”
端