Rails ActiveRecord::Base before_save 覆盖 write_ 访问器以保存电话号码
Posted
技术标签:
【中文标题】Rails ActiveRecord::Base before_save 覆盖 write_ 访问器以保存电话号码【英文标题】:Rails ActiveRecord::Base before_save overwriting the write_ accessor for saving phone number 【发布时间】:2012-10-05 10:49:02 【问题描述】:我有一个带有 text_field 电话号码标签的表单,我想将信息作为纯整数保存到数据库中。我虽然会涉及到一个 before_save,它基本上会删除所有 ()、- 等。
我在另一篇文章中发现,这样的内容可能会覆盖来自“电话”字段的值。
def original_number=(value)
value.gsub!(/\D/, '') if num.is_a?(String)
write_attribute(:original_number, num.to_i)
end
但是,=(value) 让我有点困惑。我将如何将其写为 before_save 参数?
即 before_save #######
定义#######
结束
我该如何为 original_number=(value) 写这个?
这是我的模型到目前为止的样子
# == Schema Information
#
# Table name: phones
#
# id :integer not null, primary key
# name :string(255)
# twilio_number :integer
# original_number :integer
# user_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class Phone < ActiveRecord::Base
attr_accessible :original_number, :user_id, :name, :twilio_number
belongs_to :user
validates :name, presence: true
validates :twilio_number, presence: true
validates :original_number, presence: true
validates :user_id, presence: true
default_scope order: 'phones.created_at DESC'
end
【问题讨论】:
【参考方案1】:通过定义 def original_number=(value) 方法,您将覆盖默认访问器方法。所以你不需要在 before_save 上做任何事情。 虽然代码应该看起来像
def original_number=(value)
num = value.to_s.gsub(/[^0-9+]/, "")
write_attribute(:original_number, num.to_i)
end
【讨论】:
嗨,Irfin,感谢您的澄清!我刚刚用你的正则表达式测试了它,它可以工作。【参考方案2】:试试这个
before_save :set_phone_number,
def set_phone_number
self.original_number= original_number.gsub(/\D/, '') if original_number.is_a?(String)
self.original_number = self.original_number.to_i
end
阅读更多关于 getter 和 setter 方法http://www.rubyist.net/~slagell/ruby/accessors.html , Trying to learn / understand Ruby setter and getter methods
【讨论】:
以上是关于Rails ActiveRecord::Base before_save 覆盖 write_ 访问器以保存电话号码的主要内容,如果未能解决你的问题,请参考以下文章
为啥带有 Mysql2 Gem ActiveRecord::Base.connection.execute(sql) 的 Rails 3 返回 Array 而不是 Hash?
Rails ActiveRecord - 获取与锁定的belongs_to关联