2012-05-01 15 views
11

Wiem, że before_filter jest tylko dla kontrolerów w Railsach, ale chciałbym coś takiego dla modelu: za każdym razem, gdy wywoływana jest metoda w moim modelu, chciałbym uruchomić metodę, która określa, czy powinna wywoływana metoda . Koncepcyjnie, coś takiego:Model szyn "before_filter"?

class Website < ActiveRecord::Base 
    before_filter :confirm_company 

    def confirm_company 
    if self.parent.thing == false? 
     return false 
    end 
    end 

    def method1 
    #do stuff 
    end 

end 

Więc kiedy zadzwonić @ website.method1, to najpierw zadzwonić confirm_company, a jeśli wrócę fałszywe, nie będzie działać method1. Czy Railsy mają taką funkcjonalność? Mam nadzieję, że jestem po prostu brakuje na coś oczywistego tutaj ...

+1

To znaczy, [Active Record oddzwaniania] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#callbacks-overview)? – Mischa

+0

Tak, prawdopodobnie potrzebuję wywołania zwrotnego. Ale żaden z dostępnych callbacków nie może zrobić tego, co chcę. Nie oszczędzam, nie zatwierdzam, nie intelikuję ... Wzywam metodę. –

+0

można użyć obiektu proxy i przekazać go do modelu, jeśli spełniony jest warunek – apneadiving

Odpowiedz

12
class MyModel 
    extend ActiveModel::Callbacks 
    define_model_callbacks :do_stuff 

    before_do_stuff :confirm 

    def do_stuff 
     run_callbacks :do_stuff do 
      #your code 
     end 
    end 

    def confirm 
     #confirm 
    end 
end 

naprawdę nie jestem pewien, że to będzie działać, ale można spróbować, jak ja naprawdę nie mam czasu teraz. Spójrz na to: http://api.rubyonrails.org/classes/ActiveModel/Callbacks.html

+0

To działa dokładnie tak, jak powiedziałeś. Wymaga to dotknięcia każdego modelu, ale jest to bardzo czyste rozwiązanie, biorąc pod uwagę wszystko. Dziękuję bardzo! –

+0

Fajnie :) Możesz myśleć o wyodrębnianiu rzeczy do modułów, jeśli masz powtarzające się wzorce we wszystkich modelach. Tylko myśl. – Robin

Powiązane problemy