2

我有一个带有电话号码 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
4

2 回答 2

3

通过定义 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
于 2012-10-05T11:03:24.590 回答
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尝试学习/理解 Ruby 的 setter 和 getter 方法

于 2012-10-05T10:56:24.640 回答