2012-01-09 21 views
5

tworzę aplikację e-commerce, w której kategorie są widoczne na pasku bocznym na wszystkich stronach. Napisałem metody w kontrolerze aplikacjiChcę utworzyć metodę, która będzie dostępna we wszystkich kontrolerach, a widoki

def categories 
    @categories = Category.all 
end 

ale jak mogę uczynić to metoda dostępna dla wszystkich kontrolerów i działań domyślnie tak, że nie trzeba specjalnie wywołać tę metodę w każdym działaniu

def list 
    categories 
    @products = Product.order('title').page(params[:page]).per(4) 
end 
+0

zdefiniować tę metodę w application_controller i po definicji kontrolera aplikacja dodać 'helper_method: categories' (co chcesz nazywa' helper_method') – cristian

Odpowiedz

10

You może zdefiniować twoją metodę w application_controller.rb, a ponieważ każdy inny kontroler dziedziczy z tej, ta metoda będzie dostępna dla wszystkich kontrolerów. Aby uczynić go metodą pomocniczą, aby była dostępna w widokach, można powiedzieć helper_method :my_method w application_controller.rb.

Teraz, aby był automatycznie oceniany przed jakimkolwiek działaniem w kontrolerze, można użyć filtru before_filter. Dodaj before_filter :my_method w sterowniku, że ta metoda należy ocenić przed jakimkolwiek działaniem lub w application_controller.rb

0

Jeśli chcesz coś, co ma być na całej aplikacji, tak jak w tym przypadku: @categories , a następnie napisz pomocnika.

w app/helpers/application_helper.rb

module ApplicationHelper 
    def get_all_categories 
    @categories = Category.all 
    end 
end 
-2

dont rzeczą, że istnieje sposób, aby uruchomić ten globalny. Możesz uruchomić go w postaci before_filter, tak aby był wywoływany przed każdą akcją, ale musisz to ponownie określić w każdym kontrolerze!

Moja sugestia byłoby umieścić rzeczy kategoria paska bocznego w częściowym który zawiera wywołanie takiego:

<% Category.all.each do |category| %> 
    <% do stuff to display all categories %> 
<% end %> 

Następnie można po prostu dodać wywołanie render do layout/application.html.erb że zrobi to za Ciebie!

+1

'Można go uruchomić w before_filter więc jego nazwie przed każdym działaniem, ale musisz to ponownie określić w każdym kontrolerze ... ... Jeśli umieścisz 'before_filter' w ApplicationControllerze, nie będziesz musiał określać go ponownie w każdej akcji kontrolera (ponieważ domyślnie dziedziczą filtry). Wykonujesz również wywołania modelu w widokach, które nigdy nie są dobre. Łatwo rzucaj f słowo. – iwasrobbed

+0

To nie jest problem, aby wykonać wywołanie 'all' w widoku, w którym można wywołać metody na modelu, o ile nie ma w nim logiki, która należy do' modelu' lub 'kontrolera'. – davidb

+0

Myślę, że coś takiego zdecydowanie należy do widoku, prawdopodobnie w pomocnika. Dodałem <% cache ('sidebar_categories') do%> wokół niego i aktualizację kategorii paska bocznego unieważni to. – sunkencity