2012-05-01 35 views
11

Tôi biết rằng before_filter chỉ dành cho bộ điều khiển trong Rails, nhưng tôi muốn một cái gì đó như thế này cho một mô hình: bất cứ khi nào một phương thức trong mô hình của tôi được gọi, tôi muốn chạy một phương pháp xác định . Khái niệm, một cái gì đó như thế này:Mô hình đường ray "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 

Vì vậy, khi tôi gọi @ website.method1, trước tiên nó sẽ gọi confirm_company và nếu tôi trả về false, sẽ không chạy phương thức1. Rails có chức năng như thế này không? Tôi hy vọng tôi chỉ bỏ lỡ một điều gì đó hiển nhiên ở đây ...

+1

Bạn có nghĩa là [Active Record Callback] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#callbacks-overview)? – Mischa

+0

Có, gọi lại là những gì tôi cần, tôi đoán vậy. Nhưng không ai trong số các callbacks có sẵn có thể làm những gì tôi sau. Tôi không tiết kiệm, xác nhận, intializing ... Tôi đang gọi một phương pháp. –

+0

bạn có thể sử dụng một đối tượng proxy và ủy quyền cho mô hình nếu điều kiện của bạn được đáp ứng – apneadiving

Trả lời

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 

Tôi thực sự không chắc chắn điều này sẽ hiệu quả, nhưng bạn có thể thử nó, vì tôi thực sự không có thời gian. Hãy xem xét điều đó: http://api.rubyonrails.org/classes/ActiveModel/Callbacks.html

+0

Điều này chạy chính xác như bạn đã nêu. Nó đòi hỏi tôi phải chạm vào mọi mô hình, nhưng nó là một giải pháp rất sạch sẽ, tất cả mọi thứ được xem xét. Cảm ơn rất nhiều! –

+0

Cool :) Bạn có thể nghĩ về việc giải nén nội dung vào các mô-đun nếu bạn có các mẫu lặp lại trên các mô hình của mình. Chỉ là một ý nghĩ. – Robin

1

Tôi đã tạo một gem chỉ dành cho việc này.

Bạn có thể cắm điều này vào bất kỳ lớp ruby ​​nào và thực hiện thao tác như trong bộ điều khiển.

before_action :foobar, on: [:foo] 

https://github.com/EdmundLeex/action_callback

Các vấn đề liên quan