gpt4 book ai didi

ruby-on-rails - 在保留 Model.new({attrib : 'blah' }) format

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:10 26 4
gpt4 key购买 nike

如果我在模型中重写 getter 和 setter,在我的 Controller 中为该属性创建默认初始值的最佳方法是什么?

例如,当我在 Controller 中创建模型的新实例以包含一些初始值时,表单中预填充的值显示 setter 而不是 getter 的输出。

应该怎么做?

示例

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)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

关于ruby-on-rails - 在保留 Model.new({attrib : 'blah' }) format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35932408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com