문제

I have a form with 3 virtual attributes (phoneAreaCode, phonePrefix and phoneSuffix) splitting a phone number into segments which gets joined together and saved to the database as phoneNum.

When a user goes to update their profile, most of the fields are filled in, but the virtual fields are not. I tried using what I thought was a getter to make it work, but I can't figure out what I'm missing. On that note, I'm using a nested form with address attributes from a second model, however, when these attributes are nil the form fields don't display in the update view at all. Is there a way to make those display even if they are nil? The nested form attributes appear in the sign up view, and both the sign up and update view are rendering the same form from a layout. The model is below.

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
도움이 되었습니까?

해결책 2

Works with

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

다른 팁

As I understand you only persist 'phoneNum'. You can rename that attr_accessor to attr_writer and set the getters manually.

def phoneAreaCode
  # Get phone area code
end

def phonePrefix
  # Get phone prefix
end

def phoneSuffix
  # Get phone suffix
end

Or if you really want to use that method - you can do:

after_initialize :create_phoneNum

But I would vouch for the first approach.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top