2013-04-21 2 views
0

У меня есть форма с 3 виртуальными атрибутами (phoneAreaCode, phonePrefix и phoneSuffix), разделяющая номер телефона на сегменты, которые объединяются и сохраняются в базе данных как phoneNum.Как заполнить поля виртуальной формы нераспределенным атрибутом

Когда пользователь переходит к обновлению своего профиля, большинство полей заполняются, но виртуальных полей нет. Я попытался использовать то, что, как я думал, было геттером, чтобы заставить его работать, но я не могу понять, что мне не хватает. В этой заметке я использую вложенную форму с атрибутами адреса из второй модели, однако, когда эти атрибуты равны нулю, поля формы вообще не отображаются в представлении обновления. Есть ли способ сделать эти отображения, даже если они ноль? Атрибуты вложенной формы отображаются в представлении регистрации, и оба вида регистрации и обновления отображают одну и ту же форму из макета. Модель ниже.

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+\-.][email protected][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 
+0

Где create_phoneNum = называется? – Magnuss

+0

Его нет. Я предполагал, что это был тот кусок, в котором я нуждался, я просто не мог найти ничего, что объясняло, где назвать геттер, чтобы заполнить поля. Я не был уверен, что это было то, что было обработано в модели или контроллере. –

ответ

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 
0

Как я понимаю, вы сохраняете только номер телефонаNum. Вы можете переименовать этот 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 

Но я бы ручаться за первый подход.

Смежные вопросы