2009-07-10 6 views
0

In meiner Rails-Anwendung rendere ich eine teilweise auf mehrere Seiten, und in diesem Teil ist eine Variable. Also, sagen wir mal, ich habe 5 Seiten, die rendern: partiell => "Teilname" und innerhalb von Teilname ist @variabel.Wie kann ich ein "Partial" erstellen, das seine eigene Aktion hat?

Kann ich es so haben, dass partialname eine eigene Aktion mit @ instanziierten Variable hat, anstatt dass @variable 5 Mal von jeder Aktion aufgerufen wird, die die partielle rendert?

Danke!

Antwort

0

Sie könnten @variable aus der Sicht laden:

 
<% @variable = Variable.find(:whatever) %> 

aber manche halten diese schlechte Praxis in nicht zu streng MVC haftet. Dies hat den Vorteil des Fragment-Caching aus der Box unterstützt:

 
<% cache({:variable_id => :whatever}) do %> 
<% @variable = Variable.find(:whatever) %> 
. . . 
<% end %> 

Gibt es ein gemeinsames Modell, das in den Hauptansichten gemacht hat ist, dass Sie den Variable Zugang delegieren könnten?

 
<%=h @model.variable %> 
+0

eigentlich könnte das als Lösung funktionieren! – Jess

+0

Sie sollten model.variable entkommen, ändern Sie das einfach zu <% = h model.variable%> –

+0

richtig, danke - geändert. – klochner

0

Also, ist dies ein Problem von Code läuft 5 mal pro Anfrage, die Sie lieber nicht? Wie haben Sie einen Teil bekommen und darin sind:

@my_var = MyModel.some_expensive_method 

Wenn ja, könnten Sie einfach das Ergebnis Cache im Modell:

def cached_some_expensive_method 
    @some_expensive_method ||= some_expensive_method() 
end 
2

ich ein before_filter auf allen Methoden schaffen würde, die brauche das gemeinsame Verhalten.

Aber wenn Sie wirklich wollen, dass das Partielle eine eigene "Aktion" hat, stellen Sie eine Hilfsmethode her, die alle "action-y" -Dinge ausführt, die Sie wollen, und rendert dann das Partielle. Das funktioniert im Wesentlichen genauso. Ich habe das schon einmal gemacht, um eine Vorlage zu erstellen, die verschiedene Daten enthält, die verarbeitet werden müssen.

1

Rails Sub-controllers?

meine Antwort auf diese anzeigen.

Sehr ähnliche Methode hier, die Verwendung von vor Filtern, entweder Controller-Vererbung oder Module bei Bedarf verwenden.

Verwandte Themen