Ruby on rails 如何在Rails中创建从object.attribute调用的方法?

Ruby on rails 如何在Rails中创建从object.attribute调用的方法?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我在用户型号的电话字段中将电话号码保存为国内电话号码 我做了一个快速的方法将数字转换成国际数字 我的问题是如何使这种方法像这样可用 @user.phone.to_international 而不是我现在的 to_international(@user.phone.to_international,@user.phone.country) 你知道如何做到这一点吗 这是可行的,但不确定在初始化之后是否更好 将其添加到您的用户模型中 after_find :prepare_phone priva

我在
用户
型号的
电话
字段中将电话号码保存为国内电话号码

我做了一个快速的方法将数字转换成国际数字

我的问题是如何使这种方法像这样可用

@user.phone.to_international
而不是我现在的

to_international(@user.phone.to_international,@user.phone.country)

你知道如何做到这一点吗

这是可行的,但不确定在初始化之后是否更好

将其添加到您的用户模型中

after_find :prepare_phone

private
def prepare_phone
  def phone.to_international
    self.upcase # change with whatever you want. 'self' is the phone attr 
  end
end

这是可行的,但不确定after_initialize是否更好

将其添加到您的用户模型中

after_find :prepare_phone

private
def prepare_phone
  def phone.to_international
    self.upcase # change with whatever you want. 'self' is the phone attr 
  end
end

使用to_international方法创建名为phone的类,并将用户类中的phone属性设置为phone类的实例。

使用to_international方法创建名为phone的类,并将用户类中的phone属性设置为phone类的实例。

字符串设置为
类。在myapp/config/initializers/string\u monkey\u patches.rb中添加:

String.class_eval do
  PHONE_NUMBER_FORMAT = // # some regex matching a phone number
  def to_international
    raise 'Invalid phone number format' unless self.match(PHONE_NUMBER_FORMAT)
    # convert self (the phone number string) to an international number
  end
end

猴子修补
字符串
类。在myapp/config/initializers/string\u monkey\u patches.rb中添加:

String.class_eval do
  PHONE_NUMBER_FORMAT = // # some regex matching a phone number
  def to_international
    raise 'Invalid phone number format' unless self.match(PHONE_NUMBER_FORMAT)
    # convert self (the phone number string) to an international number
  end
end


将其添加到电话号码为的任何类别?类别为
User
。如何响应属性
phone
,而不响应model
User
?不,用户是class User。电话是另一个类。那么如何编辑电话类?我通过attr_可访问性在这里找到了一个来自
ActiveRecord::Base
class的方法。attr_可访问性与它无关——如果它是一个数据库原语,它是一个字符串、int、date等。我不知道它是什么,从这里看不到它。在Ruby中添加类方法的方式与往常一样——类是开放的!将其添加到电话号码为的任何类别?类别为
User
。如何响应属性
phone
,而不响应model
User
?不,用户是class User。电话是另一个类。那么如何编辑电话类?我通过attr_可访问性在这里找到了一个来自
ActiveRecord::Base
class的方法。attr_可访问性与它无关——如果它是一个数据库原语,它是一个字符串、int、date等。我不知道它是什么,从这里看不到它。在Ruby中添加类方法的方式与往常一样——类是开放的!如果您只需要国际格式,这可能会更好。如果您需要访问原始值,则不需要太多。实际上,这并不能解决您的问题。我们必须知道什么是用户为什么?假设用户是AR模型,这似乎是合理的,为什么这不起作用呢?好吧,没关系,我想了很多。我很高兴它奏效了。这是个坏主意,你不想养成这样做的习惯。每当实例化用户对象时,都会执行after_find和after_initialize回调。您真的想在每次实例化用户对象时增加设置此方法的开销吗?从长远来看,答案应该是否定的。如果您只需要国际格式的方法,这可能会更好。如果您需要访问原始值,则不需要太多。实际上,这并不能解决您的问题。我们必须知道什么是用户为什么?假设用户是AR模型,这似乎是合理的,为什么这不起作用呢?好吧,没关系,我想了很多。我很高兴它奏效了。这是个坏主意,你不想养成这样做的习惯。每当实例化用户对象时,都会执行after_find和after_initialize回调。您真的想在每次实例化用户对象时增加设置此方法的开销吗?从长远来看,答案应该是否定的。