3

假设我有两个模型;发表评论

class Post < ActiveRecord::Base
  has_many :comments
  accepts_nested_attributes_for :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post

  before_save :do_something

  def do_something
    # Please, let me do something!
  end
end

我有一个 Post 表单,带有评论字段。一切都按预期工作,除了过滤器。使用上述配置,评论上的 before_save 过滤器不会被触发。

你能解释一下为什么,我该如何解决这个问题?

4

2 回答 2

1

在这种情况下,Rails 不会单独实例化和保存注释。您最好在 Post 模型中添加一个回调来处理嵌套评论:

class Post < AR::Base
  before_save :do_something_on_comments
  def do_something_on_comments
    comments.map &:do_something
  end
end
于 2012-09-19T14:24:07.287 回答
0

根据 Bryan Helmkamp 的说法,使用表单对象模式比使用accepts_nested_attributes_for 更好。看看7 种模式来重构 Fat ActiveRecord 模型

也许你可以做这样的事情?

class NewPost
  include Virtus

  extend ActiveModel::Naming
  include ActiveModel::Conversion
  include ActiveModel::Validations

  attr_reader :post
  attr_reader :comment

  # Forms are never themselves persisted
  def persisted?
    false
  end

  def save
    if valid?
      persist!
      true
    else
      false
    end
  end

private

  def persist!
    @post = Post.create!
    @comment = @post.comment.create!
  end
end

创建评论时会调用 do_something 。

于 2014-01-10T16:24:20.827 回答