如何在ROR 5中的模块实例方法中参考模型属性



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

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'

任何帮助将不胜感激!

这是一种很好的常见方法,但是Rails提出了对这种情况的担忧。http://api.rubyonrails.org/v5.1/classes/activeupport/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可以关注。

您做的一切正确。但是,当电子邮件本身为空/零时,方案又如何呢?然后,您将获得'nil class的未定义方法'

因此,只需像这样编辑您的代码

nil.try(:某物)不会投掷错误 - 就像迷你例外处理程序

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

最新更新