我有User
型号。其中一个属性是 phone_number 。
class User < ApplicationRecord
attr_accessor :phone_number
end
在form_for @user
中,我希望有两个输入:dialing_code
和number
。然后,当提交表单时,我希望phone_number
等于连接在一起的这些输入。其中一个解决方案是在模型中将这些输入设为attr_accessor
。
还有其他解决方案吗?我想让这些输入变量只存在于模板中,但我不知道该怎么做。
答案 0 :(得分:0)
您应该使用有时称为“虚拟属性”的模式,而不是使用attr_accessor
。我们的想法是制作一个结合了“真实”属性的getter,以及一个执行逻辑并设置相关“真实”属性的setter。
在您的情况下,它可能看起来像这样:
def phone_number
"#{dialing_code}-#{number}"
end
def phone_number=(string)
return unless string.respond_to?(:split)
self.dialing_code = string.split('-').first
self.number = string.split('-')[1..-1].join('-')
end
您需要调整此项,具体取决于您希望phone_number
显示的方式以及您希望如何将phone_number
解析为其组件dialing_code
和number
,但上面的代码为您提供了一般的想法。
现在,您可以使用phone_number
建立新用户,其dialing_code
和number
将按预期设置:
>> user = User.new(phone_number: '333-444-5555')
>> user.dialing_code
#> "333"
>> user.number
#> "444-5555"
或者,您可以单独设置dialing_code
和number
,但仍可按预期获得phone_number
:
>> user = User.new(dialing_code: '333', number: '444-5555')
>> user.phone_number
#> "333-444-5555"
答案 1 :(得分:0)
两个(或更多)选择:选择它取决于您希望如何维护数据和稍后查询。
dialing_code
,number
和phone_number
保存为属性(和数据字段)。phone_number
。before_save :construct_phone_number def construct_phone_number self.phone_number = "#{dialing_code}-#{number}" if dialing_code.present? && number.present? end
dialing_code
和number
保留为attr_accessor
并以与上述相同的方式构建phone_number
(数据库字段)。在这种情况下,dialing_code
和number
是一种抛弃属性。如果您确定用户输入总是很好并且您不需要稍后使用phone_number
调试任何类型的问题,那么可以可以使用它。注意:您需要在强参数中permit
这些虚拟属性。