嵌套表单调用自定义工厂方法而不是new()

时间:2011-08-11 06:15:40

标签: ruby-on-rails ruby-on-rails-3

此问题与此问题有关:Hashing an IP for saving

我有一个名为Post的模型。我必须在创建帖子时传入IP地址。我被告知不要覆盖initialize()。所以我使用了这里建议的工厂方法:how to override new method for a rails model

#Post.rb model
def self.new_with_ip(ip, attributes={})
  self.new(attributes['one_day_id'] = do_some_conversion_on(ip))
end

但是这不会被调用,因为Post嵌套在Discussion中,并且嵌套的表单不会调用此工厂方法。如何使表单调用此而不是传统的Post.new()

1 个答案:

答案 0 :(得分:2)

如果将此作为表单的嵌套属性传递,则必须覆盖posts_attributes=模型的Discussion方法:

def posts_attributes=(attribute_sets)
  attribute_sets.each do |attributes|
    Post.new_with_ip(ip_goes_here, attributes)
  end
end

当然,如果您要以更新方式获取嵌套帖子,您将需要稍微修改一下,因为您需要更新现有帖子而不是创建新帖子。听起来像学习中的一个很好的练习:)