2009-09-11 13 views
6

Chciałbym dodać kilka zmiennych instancji do kontrolera, ponieważ wymagane zmienne są wymagane z więcej niż jednego widoku akcji. Jednak poniższy przykład nie działa tak, jak bym się spodziewał.Dlaczego zmienne instancji mojego kontrolera nie działają w widokach (Railsy)

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 

Jak rozumiem, Railsy pobierają zmienne instancji z kontrolera i udostępniają je w widoku. Jeśli przypiszesz te same zmienne w metodach działania, działa dobrze - ale nie chcę tego robić dwa razy. Dlaczego mój sposób nie działa?

(Uwaga: to jest trochę śmieci przykład, ale mam nadzieję, że to ma sens)

EDIT: Znalazłem odpowiedź na to pytanie tutaj: When do Ruby instance variables get set?

EDIT 2: gdy jest najlepszy czas na użycie filtrów takich jak before_filter i metoda initialize?

Odpowiedz

10

Tego typu rzeczy powinny być obsługiwane w before_filter. Filtr przed filtrem, jak nazwa wskazuje, jest metodą, która zostanie wywołana przed wszelkimi działaniami lub tylko tymi, które zadeklarujesz. Przykład:

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 

Albo, można mieć swój before_filter pracować tylko na jednej ze swoich działań

before_filter :set_toppings, :only => [ :show_pizza_topping ] 

nadzieję, że to pomaga.

EDYCJA: Oto niektóre informacje na temat filters in ActionController.

+0

Tak, dziękuję. Jednak wkrótce po wysłaniu tego znalazłem kolejną odpowiedź (zaktualizowałem pytanie, aby to odzwierciedlić). Kiedy najlepiej wykorzystać filtr before_filter i/lub zainicjować? –

+0

Powiedziałbym, że powinieneś użyć filtru before_filter, jeśli jest to jakakolwiek konfiguracja, która musi działać na wielu akcjach. – theIV

+0

Jako przykład komentarza, który właśnie opuściłem, podczas sprawdzania, czy ktoś jest zalogowany, zazwyczaj można użyć metody w aplikacji "ApplicationController" i zastosować 'before_filter' do każdej czynności wymagającej zalogowania użytkownika. ma sens posiadanie tego kodu w każdym działaniu wymagającym zalogowania się. – theIV

2

To nie są zmienne instancji, prawda?

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

A.new.f 
=> nil 

Definiujesz go na poziomie klasy, a nie na poziomie instancji. Jak wskazuje "theIV", musisz je przypisać wewnątrz metody instancji.

+0

byłem pod błędne wrażenie można zrobić to w taki sposób jak w językach takich jak C# lub Java: klasa ExampleController { private String var1 = „sera”; // ... } –

+0

W Javie, tam deklarujesz zmienną instancji; w Ruby zmienne nie są zadeklarowane, więc nie ma prawdziwego odpowiednika. Wszystko w Ruby "klasa" ... "koniec" jest w zasadzie oceniane, więc może to pomóc myśleć o tym jako odpowiednik inicjalizatora statycznego Java. – Ken

Powiązane problemy