Ruby on rails 如何使用非拆分属性填充虚拟表单字段
我有一个带有3个虚拟属性(phoneAreaCode、phonePrefix和phoneSuffix)的表单,将电话号码拆分为多个段,这些段连接在一起并作为phoneNum保存到数据库中 当用户去更新他们的配置文件时,大多数字段都已填写,但虚拟字段未填写。我试着用我认为有效的方法让它发挥作用,但我不知道我错过了什么。注意,我使用的是第二个模型中带有地址属性的嵌套表单,但是,当这些属性为nil时,表单字段根本不会显示在更新视图中。是否有一种方法可以使这些显示即使它们为零?嵌套的表单属性显示在“注册”视图中,并且“注册”和“更新”视图都从布局中呈现相同的表单。模型如下Ruby on rails 如何使用非拆分属性填充虚拟表单字段,ruby-on-rails,forms,getter-setter,virtual-attribute,Ruby On Rails,Forms,Getter Setter,Virtual Attribute,我有一个带有3个虚拟属性(phoneAreaCode、phonePrefix和phoneSuffix)的表单,将电话号码拆分为多个段,这些段连接在一起并作为phoneNum保存到数据库中 当用户去更新他们的配置文件时,大多数字段都已填写,但虚拟字段未填写。我试着用我认为有效的方法让它发挥作用,但我不知道我错过了什么。注意,我使用的是第二个模型中带有地址属性的嵌套表单,但是,当这些属性为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
class用户
据我所知,您只保留“phoneNum”。您可以将attr\u访问器重命名为attr\u writer,并手动设置getter
def phoneAreaCode
# Get phone area code
end
def phonePrefix
# Get phone prefix
end
def phoneSuffix
# Get phone suffix
end
或者,如果你真的想使用这种方法,你可以:
after_initialize :create_phoneNum
但我可以担保第一种方法。与
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
create_phoneNum=调用在哪里?不是。我猜这就是我需要的部分,我只是找不到任何东西来解释在哪里调用getter来填充字段。我不确定这是在模型还是控制器中处理的。