2015-06-09 2 views
1

У меня есть обратный вызов и метод, определенные в родительском классе Rails STI.Rails STI, callbacks и public vs. private

class Parent < ActiveRecord::Base 
    before_save :populate_name 

    # implicitly public 
    def populate_name 
    self.name = "foobar" 
    end 

class Child < Parent 
end 

Когда я делаю populate_name private или protected так:

class Parent < ActiveRecord::Base 
    before_save :populate_name 

    private 
    def populate_name 
    self.name = "foobar" 
    end 

class Child < Parent 
end 

Тогда я получаю эту ошибку:

NameError - undefined local variable or method `populate_name' for #<Child:0x007ff901eace30>: 
    activemodel (3.2.16) lib/active_model/attribute_methods.rb:407:in `method_missing' 
    activerecord (3.2.16) lib/active_record/attribute_methods.rb:149:in `method_missing' 
    activesupport (3.2.16) lib/active_support/callbacks.rb:407:in `_run__3119425560225797910__save__1411052685854526397__callbacks' 
    activesupport (3.2.16) lib/active_support/callbacks.rb:405:in `__run_callback' 
    activesupport (3.2.16) lib/active_support/callbacks.rb:385:in `_run_save_callbacks' 
    activesupport (3.2.16) lib/active_support/callbacks.rb:81:in `run_callbacks' 
    activerecord (3.2.16) lib/active_record/callbacks.rb:264:in `create_or_update' 
    activerecord (3.2.16) lib/active_record/persistence.rb:84:in `save' 
    activerecord (3.2.16) lib/active_record/validations.rb:50:in `save' 
    activerecord (3.2.16) lib/active_record/attribute_methods/dirty.rb:22:in `save' 
    activerecord (3.2.16) lib/active_record/transactions.rb:259:in `block (2 levels) in save' 
    activerecord (3.2.16) lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status' 
    activerecord (3.2.16) lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
    activerecord (3.2.16) lib/active_record/transactions.rb:208:in `transaction' 
    activerecord (3.2.16) lib/active_record/transactions.rb:311:in `with_transaction_returning_status' 
    activerecord (3.2.16) lib/active_record/transactions.rb:259:in `block in save' 
    activerecord (3.2.16) lib/active_record/transactions.rb:270:in `rollback_active_record_state!' 
    activerecord (3.2.16) lib/active_record/transactions.rb:258:in `save' 
    app/controllers/child_controller.rb:135:in `create_or_update' 

требуется public для обратного вызова?

ответ

0

Сохраняя этот вопрос в случае, когда кто-нибудь Googles это (и это жирный палец вещь).

Я случайно положил частную часть после окончания для класса перед окончанием модуля. Легко просто бросить частный, а затем частный метод до конца, но нужно действительно быть осторожным, если есть гнездование!

Так да

  1. сделать обратные вызовы частной
  2. , если вы не видите что-то в запросе Google для чего-то простого, вы должны иметь жир перебирал что-то
module Foo 
    class Parent < ActiveRecord::Base 
    before_save :populate_name 
    end 

    private 

    def populate_name 
    self.name = "foobar" 
    end 
end 

class Child < Parent 
end 

Затем я получаю эту ошибку:

NameError - undefined local variable or method `populate_name' for #<Child:0x007ff901eace30>: 
    activemodel (3.2.16) lib/active_model/attribute_methods.rb:407:in `method_missing' 
    activerecord (3.2.16) lib/active_record/attribute_methods.rb:149:in `method_missing' 
    activesupport (3.2.16) lib/active_support/callbacks.rb:407:in `_run__3119425560225797910__save__1411052685854526397__callbacks' 
    activesupport (3.2.16) lib/active_support/callbacks.rb:405:in `__run_callback' 
    activesupport (3.2.16) lib/active_support/callbacks.rb:385:in `_run_save_callbacks' 
    activesupport (3.2.16) lib/active_support/callbacks.rb:81:in `run_callbacks' 
    activerecord (3.2.16) lib/active_record/callbacks.rb:264:in `create_or_update' 
    activerecord (3.2.16) lib/active_record/persistence.rb:84:in `save' 
    activerecord (3.2.16) lib/active_record/validations.rb:50:in `save' 
    activerecord (3.2.16) lib/active_record/attribute_methods/dirty.rb:22:in `save' 
    activerecord (3.2.16) lib/active_record/transactions.rb:259:in `block (2 levels) in save' 
    activerecord (3.2.16) lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status' 
    activerecord (3.2.16) lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
    activerecord (3.2.16) lib/active_record/transactions.rb:208:in `transaction' 
    activerecord (3.2.16) lib/active_record/transactions.rb:311:in `with_transaction_returning_status' 
    activerecord (3.2.16) lib/active_record/transactions.rb:259:in `block in save' 
    activerecord (3.2.16) lib/active_record/transactions.rb:270:in `rollback_active_record_state!' 
    activerecord (3.2.16) lib/active_record/transactions.rb:258:in `save' 
    app/controllers/child_controller.rb:135:in `create_or_update' 
Смежные вопросы