0

電話番号をセグメントに分割する 3 つの仮想属性 (phoneAreaCode、phonePrefix、phoneSuffix) を持つフォームがあり、これらのセグメントは結合され、phoneNum としてデータベースに保存されます。

ユーザーがプロファイルを更新しようとすると、ほとんどのフィールドが入力されますが、仮想フィールドは入力されません。ゲッターだと思ったものを使って動かそうとしましたが、何が欠けているのかわかりません。その点について、私は 2 番目のモデルのアドレス属性を持つネストされたフォームを使用していますが、これらの属性が nil の場合、フォーム フィールドは更新ビューにまったく表示されません。それらがnilであってもそれらを表示する方法はありますか? ネストされたフォーム属性がサインアップ ビューに表示され、サインアップ ビューと更新ビューの両方がレイアウトから同じフォームをレンダリングしています。モデルは以下。

class User < ActiveRecord::Base
  attr_accessor :phoneAreaCode, :phonePrefix, :phoneSuffix

  attr_accessible :MOS, :dateOfBirth, :ets_pcsDate, :firstName, 
  :lastName, :middleInitial, :phoneNum, :phoneAreaCode, :phonePrefix,
  :phoneSuffix, :rank, :email, :password, :password_confirmation, 
  :address_attributes

  has_secure_password
  has_one :address, dependent: :destroy

  accepts_nested_attributes_for :address


  before_save {  |user| user.email = email.downcase  }
  before_save :create_remember_token
  before_save :create_phoneNum

  validates :rank,      presence: true
  validates :firstName,     presence: true, length: {  maximum: 15  }
  validates :lastName,  presence: true, length: {  maximum: 20  }
  validates :middleInitial, presence: true, length: {  maximum: 1  }

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email,presence: true,  format: {  with: VALID_EMAIL_REGEX  },
                        uniqueness: {  case_sensitive: false  }

  validates :dateOfBirth,    presence: true
  VALID_MOS_REGEX = /\A\d{2}[a-zA-Z]\z/
  validates :MOS,           presence: true, 
                                    format: {  with: VALID_MOS_REGEX }
  validates :ets_pcsDate,       presence: true

  VALIDATE_AREA_PREFIX_REGEX = /\A\d{3}\z/
  validates :phoneAreaCode,     presence: true,  
                                    format: { with: VALIDATE_AREA_PREFIX_REGEX }                               
  validates :phonePrefix,           presence: true,
                                    format: { with: VALIDATE_AREA_PREFIX_REGEX }
  VALIDATE_SUFFIX_REGEX = /\A\d{4}\z/                                       
  validates :phoneSuffix,           presence: true,
                                    format: { with: VALIDATE_SUFFIX_REGEX }
  validates :password,      length: {  minimum: 6  }
  validates :password_confirmation, presence: true


  private
    def create_phoneNum
      self.phoneNum = [phoneAreaCode, 
                      phonePrefix, phoneSuffix].join(' ')
    end

    def create_phoneNum=(phoneNum)
      split = phoneNum.split(' ', 3)
      self.phoneAreaCode = split.first
      self.phonePrefix = split.second
      self.phoneSuffix = split.last
    end

    def create_remember_token
      self.remember_token = SecureRandom.urlsafe_base64
    end
end
4

2 に答える 2

0

で動作します

def phoneAreaCode
  if phoneNum != nil
     @phoneAreaCode ||= self.phoneNum.split(' ')[0]
  else
     @phoneAreaCode
  end
end

def phonePrefix
  if phoneNum != nil
    @phonePrefix ||= self.phoneNum.split(' ')[1]
  else
    @phonePrefix
  end
end

def phoneSuffix
  if phoneNum != nil
    @phoneSuffix ||= self.phoneNum.split(' ')[2]
  else
    @phoneSuffix
  end
end
于 2013-04-28T16:36:54.513 に答える
0

私が理解しているように、「phoneNum」のみを保持します。その attr_accessor の名前を attr_writer に変更し、ゲッターを手動で設定できます。

def phoneAreaCode
  # Get phone area code
end

def phonePrefix
  # Get phone prefix
end

def phoneSuffix
  # Get phone suffix
end

または、本当にその方法を使用したい場合は、次のことができます。

after_initialize :create_phoneNum

しかし、私は最初のアプローチを保証します。

于 2013-04-21T20:23:28.940 に答える