Ruby on rails 虚拟属性&;轨道

Ruby on rails 虚拟属性&;轨道,ruby-on-rails,Ruby On Rails,我的应用程序中有一个电话号码的手机模型,其构建如下: t.column :number, :string t.references :phoneable, :polymorphic => true 我想限制数字的格式为317.555.5555x234,因此我创建了一个包含四个框的表单(区号,3位,4位,分机): 我假设一个虚拟属性就是要走的路线(la railscasts ep16),但不确定如何从4个单独的文本字段中组合“数字” 我想我必须这样做: def full_

我的应用程序中有一个电话号码的手机模型,其构建如下:

t.column      :number,    :string
t.references  :phoneable, :polymorphic => true
我想限制数字的格式为317.555.5555x234,因此我创建了一个包含四个框的表单(区号,3位,4位,分机):

我假设一个虚拟属性就是要走的路线(la railscasts ep16),但不确定如何从4个单独的文本字段中组合“数字”

我想我必须这样做:

def full_number=(phone)
  self.number = area_code+"."+first_three_digits+"."+second_four_digits+"."+extension
end

但我不确定如何从表单输入中组合数字。有什么想法吗?

我通常在保存之前这样做:

before_save :update_phone_number

def update_phone_number
  self.phone_number = [area_code, first_three_digits, second_four_digits, extension].reject(&:blank?).join('.')
end
首先,我将进行一些验证:

validates_presence_of :area_code, :first_three_digits, :second_four_digits
validates_format_of :area_code, :with => /\d{3}/
validates_format_of :first_three_digits, :with => /\d{3}/
validates_format_of :second_four_digits, :with => /\d{4}/
validates_format_of :extension, :with => /\d{0,6}/, :allow_blank => true
这只是为了确保您在电话号码中获得有效数据,并且在保存之前不会抛出任何错误。我还假设您允许扩展为空,但很容易更改

编辑:您需要为电话号码的不同部分设置属性访问器:

attr_accessor :area_code, :first_three_digits, :second_four_digits, :extension

非北美用户不是问题?不是。。。这是印第安纳波利斯一家非营利机构的活动注册。虽然外国游客决定登记参加跑步/散步的可能性很小,但这不值得处理,因为我怀疑他们是否曾经有过外国游客。我的电话分机是4位数,在我的学校是5位数。也许应该是一个范围
{0,6}
?杰夫,这几天你一直是我的救星!哈哈,谢谢你的帮助,我真的很感激。看起来,通过这种方法,您可以将区号、第一个三位数、第二个四位数等作为迁移中的条目,以及连接所有其他字段的电话号码字段。当我的表中只有电话号码列,而没有区号等列时,我可以处理此操作吗。这样我就不会存储不必要的数据,但在我的视图中仍然有单独的文本字段?啊,是的,这种方法在没有区域代码等列的情况下工作。您可以对模型中的任何属性应用验证。我添加了一行,以将attr_访问器添加到模型中。
attr_accessor :area_code, :first_three_digits, :second_four_digits, :extension