假设以下模型:
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” 。删除“超级”或在“初始化”方法中进一步向下移动会导致其他错误。
有机会让这个工作吗?
答案 0 :(得分:1)
如果要初始化模型,然后在不重新初始化的情况下传递属性,则可以执行以下操作:
@model = Model.new
@model.attributes = params[:model]
但是,根据ActiveRecord解析您的参数的顺序,当您遇到du = 1000
和duration=
方法时,使用默认值duration_day=
时可能会遇到问题。< / p>
答案 1 :(得分:0)
当你在没有参数的情况下调用super
时,它会将initialize的参数传递给它。要正确初始化它,请使用super()
:
def initialize(*args)
super()
self.du = 1000
end