我想将我的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