一些背景知识:我有一个带有小数列的 Rails 4 模型d
。在应用程序中保存或查看时,可能需要根据当前用户的偏好将值分别转换为整数值或从整数值转换。
计算应该进入模型似乎最合适,并且不应该了解用户。
在进行了一些搜索之后,在我看来,实现这一目标的最佳方法是通过模型上的 2 个虚拟属性:一个用于当前用户的首选格式,一个用于值,应用任何计算。
所以我想出了这样的事情:
attr_accessor :format, :value_converted
def value_converted
if format.nil?
format = 'A'
end
if format == 'A'
Converter.new(d).to_i if d
else
d if d
end
end
def value_converted=(value)
if format.nil?
format = 'A'
end
if format == 'A'
self.d = Converter.new(value.to_i).to_f
else
self.d = value
end
表单是指value_converted
而不是d
,这适用于编辑、更新和查看。问题是#create
行动。
我相信这个问题正在发生,因为 setter 正在访问format
,而且我似乎无法在调用 setter 之前找到一种设置方法format
,#create
换句话说,当new
创建对象时。
我想也许我可以将它format
与其他参数一起传递(如在这个答案中,所以我尝试在标准强参数票价之内和之后将它合并,但没有运气:
两个都
@entry = current_user.entries.new(entry_params.merge(format: current_user.format))
和
params.require(:entry).permit(:value_converted, :other_param, ...).merge(format: current_user.format)
不要引发任何错误,但显然会被忽略。但是,只需在控制台中传递format
to就可以了。new
所以我的问题是:有没有人可以解决这个问题?或者也许是更好/更合适的方式?看起来应该很简单。
谢谢你的帮助