通过关联构建嵌套的STI资源时,Rails回调不会触发

时间:2013-06-05 19:11:37

标签: ruby-on-rails ruby callback sti

以下面的例子为例:

class Foo < AR::Base
  has_many :bars, :as => :barable, :dependent=> :destroy
  accepts_nested_attributes_for :bars, :allow_destroy => true
end

class Bar < AR::Base
   belongs_to :barable, :polymorphic => true  
end

class Baz < Bar

  before_save do 
    raise "Hi"
  end

end

在'Foo'的表单中 - 我有fields_for :bars_attributes隐藏字段将type设置为'Baz'。 'Baz'已成功创建,但回调从未触发。 (但是,当在控制台中手动创建'Baz'时,它会激活。)

任何建议表示赞赏!

2 个答案:

答案 0 :(得分:2)

Baz的回调只有在您将其创建为Baz对象时才会触发,即Baz.new(...)

但是,您没有创建Baz记录,而是创建Bar记录:Bar.new(type: 'Baz')。 这只会触发Bar的回调,即使稍后会将其视为Baz

答案 1 :(得分:0)

您需要在Foot.rb中指定其他关联

has_many :bazs
# or
# has_many :bazs class_name: 'ModuleName::Baz' # if you scoped your child classed within some module

如果你那样做

before_save do 
  raise "Hi"
end

将启动,例如@current_user.bazs.build