我有两个模型:出价和模板。创建的每个新出价都需要使用现有Template实例的属性中的值预填充某些属性。首先,我会在控制器中执行此操作吗?这就是我目前正在努力做的事情。我的新动作如下:
(注意:我正在使用邪恶的宝石逐步构建对象)
def new
@bid = Bid.new
prepopulate(@bid.id)
redirect_to wizard_path(steps.first, :bid_id => @bid.id)
end
我的预填方法:
def prepopulate(bid_id)
@bid = Bid.find(bid_id)
@template = Template.find(:first)
@bid.update_attribute(attribute_1: @template.attribute_1)
end
它不会更新出价中的属性。它也没有引起任何错误。有没有更好的方法来完成我想要做的事情?如果没有,我如何更新模板实例的属性?
答案 0 :(得分:4)
这是明确的模型问题,因此应将其移至您的模型中:
型号:
def prepopulate
template = Template.find(:first)
attribute_1 = template.attribute_1
end
控制器:
@bid = Bid.new # create?
@bid.prepopulate
但是,由于您需要为每一个Bid执行此操作,因此只需使用after_initialize挂钩方法:
class Bid < AR::Base
after_initialize :prepopulate
private
def prepopulate
return unless new_record?
template = Template.first
self.attribute_1 = template.attribute_1
end
end
end
这种方法并不要求您在控制器中执行任何操作,只需简单地调用new
即可。