如何初始化ActiveRecord模型BEFORE表单数据通过调用params [:model]来处理?

时间:2011-08-08 13:53:02

标签: ruby-on-rails activerecord initialization

假设以下模型:

class Model < ActiveRecord::Base
 def initialize(*args)
  super
  self.du = 1000
 end

 def duration=(val)
  self.du = val
 end

 def duration_day
  (du / (60 * 60 * 24)).floor
 end

 def duration_day=(val)
  duration_tmp = duration_day - val
  self.duration = duration_tmp
 end
end

属性“du”在数据库中保留。我想在创建一个新的Model实例时初始化“du”,以便填充一个名为“duration_day”的表单元素。到目前为止这是有效的。

但是,当提交表单并且用户提供的“duration_day”值通常由控制器传播到Model的新实例时:

def create
  @model = Model.new
  @model = Model.new(params[:model])
end

...,我得到一个NoMethodError 未定义的方法`/'用于nil:NilClass 因为属性“du”此时尚未初始化,因为在实际初始化之前调用了“super” 。删除“超级”或在“初始化”方法中进一步向下移动会导致其他错误。

有机会让这个工作吗?

2 个答案:

答案 0 :(得分:1)

如果要初始化模型,然后在不重新初始化的情况下传递属性,则可以执行以下操作:

@model = Model.new
@model.attributes = params[:model]

但是,根据ActiveRecord解析您的参数的顺序,当您遇到du = 1000duration=方法时,使用默认值duration_day=时可能会遇到问题。< / p>

答案 1 :(得分:0)

当你在没有参数的情况下调用super时,它会将initialize的参数传递给它。要正确初始化它,请使用super()

 def initialize(*args)
  super()
  self.du = 1000
 end