如何在RoR 5中的模块实例方法中引用模型属性

时间:2017-09-26 09:24:28

标签: ruby-on-rails ruby module ruby-on-rails-5

我想将我的downcase_email方法移出我的User类,因为我有多个Classes需要让他们的电子邮件降级。我不确定这是否是正确的方法,但我创建了一个模块并将方法移入其中。

class User < ApplicationRecord
  include ModelUtilities

  before_save   :downcase_email

  # downcase_email was previously here
  #
  # def downcase_email
  #   self.email = email.downcase
  # end 
end
lib / model_utilities.rb中的

文件

module ModelUtilities

  def downcase_email
    self.email = email.downcase
  end

end

当我运行代码时,出现以下错误:

NoMethodError (undefined method `downcase' for nil:NilClass):

lib/model_utilities.rb:6:in `downcase_email'

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

这是一种很好的通用方法,但Rails建议对此案件表示担忧。 http://api.rubyonrails.org/v5.1/classes/ActiveSupport/Concern.html

在您的情况下,代码将是:

# file in models/concerns/model_utilities.rb

module ModelUtilities
  extend ActiveSupport::Concern

  included do
    before_validation :downcase_email
  end

  def downcase_email
    email.downcase!
  end

end


# include your concern
class User < ApplicationRecord
  include ModelUtilities
end

看起来before_validation可以转移到关注点。

答案 1 :(得分:0)

你正在做的一切都是正确的。但是当电子邮件本身为空/零时的情况呢?然后你会得到'未定义的方法为nil class'

只需像这样编辑你的代码

  

nil.try(:something)不会抛出错误 - 它就像迷你异常处理程序

 def downcase_email
    self.email = email.try(:downcase)
 end