我想将我的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'
任何帮助将不胜感激!
答案 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