虚拟属性&轨道

时间:2010-07-27 17:09:03

标签: ruby-on-rails

我的应用程序中有一个电话型号用于建立如下电话号码:

t.column      :number,    :string
t.references  :phoneable, :polymorphic => true

我想将数字限制为格式317.555.5555x234,所以我创建的表格有四个方框(区号,3位,4位,分机):

- form_for @user do |user_form|
  -user_form.fields_for :phones do |phone|
    = phone.text_field :area_code
    = phone.text_field :first_three_digits
    etc...

我假设一个虚拟属性将是要去的路线(一个轨道广播ep16),但不知道如何从4个单独的text_fields中组装“数字”。

我想我必须做这样的事情:

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

但我不确定如何从表格输入中汇总数字。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我通常将此作为before_save:

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_accessors:

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