2009-08-07 22 views
1

我有一個控制器和一個視圖(這個沒有ActiveRecord)。控制器計算世界上幾個地方的當前時間,視圖顯示它們。在軌道上的紅寶石表單提交後刷新一個DIV

我想添加一個按鈕,使時鐘更新。添加一個刷新整個頁面的常規按鈕很好,但我想用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 %> 

感謝您的幫助

回答

1

移動clocks_div的內容分成它自己的部分(但不是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 
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,並通過單獨行動,以使其

0

如果妳不想要的觀點側更新,你可以做到這一點從動作方面通過渲染更新

例如。

render:update do | page |
page [:clocks_div] .innerHTML = render:partial =>「controls/tag_list」
end