2012-05-01 2 views
11

before_filter는 Rails의 컨트롤러에만 사용되지만 모델에 대해서는 이와 비슷한 것을 원합니다. 모델의 메서드가 호출 될 때마다 호출 된 메서드가 실행되어야하는지 여부를 결정하는 메서드를 실행하고 싶습니다. . 개념적으로,이 같은 : 나는 @ website.method1를 호출 할 때레일스 모델 "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 

그래서, 먼저 confirm_company를 호출합니다, 나는 false를 반환하는 경우, 방법 항목을 실행되지 않습니다. Rails에는 이와 같은 기능이 있습니까? 나는이 작동 정말 모르겠어요 난 그냥

+1

을 의미 [액티브 레코드 콜백 (http://guides.rubyonrails.org/active_record_validations_callbacks.html#callbacks-overview)? – Mischa

+0

예, 콜백이 필요합니다. 그러나 사용할 수있는 콜백 중 내가 할 수있는 콜백은 없습니다. 나는 저장하고 검증하지 않고 초기화하지 않는다 ... 나는 방법을 호출하고있다. –

+0

조건이 충족되면 프록시 개체를 사용하고 모델에 위임 할 수 있습니다. – apneadiving

답변

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 

... 여기에 분명 뭔가 놓치고있어 좋겠지 만 난 정말 지금 시간이 그나마 당신은 그것을 시도 할 수 있습니다. 다음을보십시오 : http://api.rubyonrails.org/classes/ActiveModel/Callbacks.html

+0

귀하가 진술 한대로 정확하게 실행됩니다. 모든 모델을 다룰 필요가 있지만 모든 것을 고려한 매우 깨끗한 솔루션입니다. 매우 감사합니다! –

+0

Cool :) 모델 전체에서 반복 패턴이 있으면 모듈을 추출하는 것에 대해 생각할 수 있습니다. 그냥 생각. – Robin

1

나는 이것을 위해 보석을 만들었습니다.

루비 클래스에 플러그인 할 수 있으며 컨트롤러에서와 유사한 기능을 수행 할 수 있습니다. 당신은

before_action :foobar, on: [:foo] 

https://github.com/EdmundLeex/action_callback

관련 문제