Rails 4 - 从另一个模型中预先填充新记录

时间:2014-04-24 20:12:12

标签: ruby-on-rails ruby ruby-on-rails-4 controller

我有两个模型:出价和模板。创建的每个新出价都需要使用现有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

它不会更新出价中的属性。它也没有引起任何错误。有没有更好的方法来完成我想要做的事情?如果没有,我如何更新模板实例的属性?

1 个答案:

答案 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即可。