将rails form-only值分配给model&#39的另一个属性

时间:2018-03-11 14:51:29

标签: ruby-on-rails ruby erb

我有User型号。其中一个属性是 phone_number

class User < ApplicationRecord
   attr_accessor :phone_number
end

form_for @user中,我希望有两个输入:dialing_codenumber。然后,当提交表单时,我希望phone_number等于连接在一起的这些输入。其中一个解决方案是在模型中将这些输入设为attr_accessor

还有其他解决方案吗?我想让这些输入变量只存在于模板中,但我不知道该怎么做。

2 个答案:

答案 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_codenumber,但上面的代码为您提供了一般的想法。

现在,您可以使用phone_number建立新用户,其dialing_codenumber将按预期设置:

>> user = User.new(phone_number: '333-444-5555')
>> user.dialing_code
#> "333"
>> user.number
#> "444-5555"

或者,您可以单独设置dialing_codenumber,但仍可按预期获得phone_number

>> user = User.new(dialing_code: '333', number: '444-5555')
>> user.phone_number
#> "333-444-5555"

答案 1 :(得分:0)

两个(或更多)选择:选择它取决于您希望如何维护数据和稍后查询。

  1. dialing_codenumberphone_number保存为属性(和数据字段)。
    在模板中,请求dialing_code和number,并在钩子中构建phone_number
  2. before_save :construct_phone_number
    def construct_phone_number
      self.phone_number = "#{dialing_code}-#{number}" if dialing_code.present? && number.present?
    end
    
    1. dialing_codenumber保留为attr_accessor并以与上述相同的方式构建phone_number(数据库字段)。在这种情况下,dialing_codenumber是一种抛弃属性。如果您确定用户输入总是很好并且您不需要稍后使用phone_number调试任何类型的问题,那么可以可以使用它。
    2. 注意:您需要在强参数中permit这些虚拟属性。