如果我重写模型中的 getter 和 setter,那么在控制器中为该属性创建默认初始值的最佳方法是什么?
例如,当我在控制器中创建模型的新实例以包含一些初始值时,表单中的预填充值显示来自 setter 而不是 getter 的输出。
这应该怎么做呢?
Example
class Something < ActiveModel:Base
# override getter
def attr_a
self[:attr_a] * 5
end
# override setter
def attr_a=
self[:attr_a] = attr_a / 5 # i.e. 10 / 5 = 2
end
end
class SomethingController < ActiveController
def new
@something = Something.new({attr_a: 10})
end
end
# index.html.erb
<% form_for @something do |f| %>
<% f.text_field :attr_a %>
<% f.submit 'Save' %>
<% end %>
在此示例中,表单中的 text_field 填充为 2 而不是 10。
我可以明白为什么显示 2 是有意义的,因为设置被调用为对象实例化的一部分,但是我是否以错误的方式获得我想要的结果?
本质上,数据需要以不同于应用程序逻辑中使用方式以及用户应看到的方式存储在数据库中。我想让它尽可能无缝。
我不会使用相同的属性名称。如果数据库中的值与对象返回的值不同,那么这会令人困惑并且容易出错。不知道发生的转换的人会构建有错误的代码,例如:
Something.where('attr_a < 10')
如果您确实必须这样做,那么您可以使用以下命令读取/写入属性值read_attribute(:attr_a)
and write_attribute(:attr_a, value)
从物体内部。
但我会做这样的事情:假设你想存储一个价格Product
以美分为整数。 (忽略特殊情况,例如 nil 或带有字符串的表单提交以及浮点除法问题、舍入等):
class Product < ActiveRecord::Base
def price
price_in_cents / 100.0
end
def price=(value)
self.price_in_cents = value * 100
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)