2009-09-11 5 views
6

Ich möchte meinem Controller einige Instanzvariablen hinzufügen, da die betreffenden Variablen in der Ansicht mehrerer Aktionen benötigt werden. Das folgende Beispiel funktioniert jedoch nicht wie erwartet.Warum funktionieren die Instanzvariablen meines Controllers nicht in Sichten? (Rails)

class ExampleController < ApplicationController 
    @var1 = "Cheese" 
    @var2 = "Tomato" 

    def show_pizza_topping 
    # What I want is the above instance vars from within the view here 
    end 

    def show_sandwich_filling 
    # What I want is the above instance vars from within the view here 
    end 
end 

Wie ich es verstehe, nimmt Rails die Instanzvariablen vom Controller und stellt sie in der Ansicht zur Verfügung. Wenn ich die gleichen Variablen innerhalb der Aktionsmethoden zuweisen, funktioniert es gut - aber ich möchte es nicht zweimal machen. Warum funktioniert mein Weg nicht?

(Hinweis: Dies ist ein bisschen wie ein Müll Beispiel ist, aber ich hoffe, dass es Sinn macht)

EDIT: When do Ruby instance variables get set?

EDIT 2:: Ich habe die Antwort auf diese Frage hier gefunden haben, wenn ist die beste Zeit, um Filter wie before_filter und die Initialize-Methode zu verwenden?

Antwort

10

Diese Art von Dingen sollte in einem before_filter gehandhabt werden. Ein Vorher-Filter ist, wie der Name schon sagt, eine Methode, die vor allen Aktionen aufgerufen wird, oder nur die, die Sie deklarieren. Ein Beispiel:

class ExampleController < ApplicationController 

    before_filter :set_toppings 

    def show_pizza_topping 
    # What I want is the above instance vars from within the view here 
    end 

    def show_sandwich_filling 
    # What I want is the above instance vars from within the view here 
    end 

protected 

    def set_toppings 
    @var1 = "Cheese" 
    @var2 = "Tomato" 
    end 

end 

Oder könnten Sie Ihre before_filter nur

auf einer Ihrer Aktionen arbeiten
before_filter :set_toppings, :only => [ :show_pizza_topping ] 

Hoffnung, das hilft.

EDIT: Hier sind einige weitere Informationen zu filters in ActionController.

+0

Ja es tut, danke. Aber kurz nachdem ich dies gepostet habe, habe ich eine andere Antwort gefunden (ich habe die Frage aktualisiert, um das zu reflektieren). Wann ist die beste Zeit, um before_filter zu verwenden und/oder zu initialisieren? –

+0

Ich würde sagen, dass Sie ein before_filter verwenden sollten, wenn es irgendeine Art von Einrichtungsarbeit ist, die an mehreren Aktionen arbeiten muss. – theIV

+0

Als Beispiel für den Kommentar, den ich gerade hinterlassen habe, haben Sie bei der Überprüfung, dass jemand eingeloggt ist, in der Regel eine Methode in 'ApplicationController' und wenden eine' before_filter' auf alle Aktionen an, bei denen der Benutzer angemeldet sein muss Sinn machen, diesen Code in jeder Aktion zu haben, die jemanden erfordert, der eingeloggt sein muss. – theIV

2

Das sind keine Instanzvariablen, oder?

class A 
    @x = 5 
    def f 
    puts @x 
    end 
end 

A.new.f 
=> nil 

Sie definieren es auf Klassenebene, nicht auf Instanzenebene. Wie "theIV" angibt, müssen Sie sie innerhalb einer Instanzmethode zuweisen.

+0

Ich war unter dem falschen Eindruck Sie könnten es auf diese Weise tun, wie in Sprachen wie C# oder Java: Klasse ExampleController { private Zeichenfolge var1 = "Käse"; // ... } –

+0

In Java deklarieren Sie eine Instanzvariable; In Ruby werden keine Variablen deklariert, also gibt es keine echte Entsprechung. Alles was in Ruby "class" .. "end" ist, wird grundsätzlich ausgewertet, daher könnte es hilfreich sein, dies als äquivalent zu einem statischen Java-Initialisierer zu betrachten. – Ken