2009-08-07 22 views
1

Ich habe einen Controller und eine Ansicht (keine ActiveRecord für diese). Der Controller berechnet die aktuelle Zeit an mehreren Orten der Welt und die Ansicht präsentiert sie.Aktualisieren eines DIV nach dem Senden des Formulars in Ruby auf Schienen

Ich möchte eine Schaltfläche hinzufügen, die die Uhren aktualisieren wird. Das Hinzufügen einer normalen Schaltfläche, die die ganze Seite aktualisiert, funktioniert gut, aber ich möchte das asynchron mit AJAX machen. Ich habe versucht, form_remote_tag zu verwenden, aber dann geschieht nichts, weil nichts aufgefrischt wird ...

Wie mache ich das?

(BTW, ich mache das Schiene für das Lernen Es gibt keinen wirklichen Bedarf oder Anforderung.)

Meinen Code: Der Controller interessanten Teil:

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

Der Blick interessanten Teil:

<%= 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 %> 

Danke für die Hilfe

Antwort

1

the Move Inhalt des clocks_div in sein eigenes partielles (aber nicht das div selbst). Dann können Sie in der Indexseite eine link_to_remote, button_to_remote oder sogar periodisch_call_remote verwenden, um das div zu aktualisieren.

So:

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

oder

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

Dann in Ihrem Controller so etwas wie: (Ich habe einige Refactoring hier hinzugefügt)

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

ich glaube, Sie muss an form_remote_view der Name des Div, das Sie aktualisieren möchten, und die Aktion/Controller, die Sie verwenden möchten. Probieren Sie etwas wie folgt aus:

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

HINWEIS: Obwohl dies funktionieren sollte, kann es zweckmäßig sein, die Vorlage für die clocks_div in eine partial zu bewegen und durch eine separate Aktion zu machen

0

Wenn u die nicht wollen, View Side Updation, kann dies von der Aktion Seite zu tun, indem Sie aktualisieren

ZB.

rendern: update do | page |
Seite [: clocks_div] .innerHTML = render: partial => "Kontrollen/tag_list"
Ende

Verwandte Themen