Rails 6 - NoMethodError(nil:NilClass 的未定义方法 `titleize')
Rails 6 - NoMethodError (undefined method `titleize' for nil:NilClass)
我在这里查看了有关我的错误的问题,但它们似乎无关,因此 post。
我的 UserProfile 模型中有一个 'capitalize_names' 方法,当我在控制台中更新属性时会抛出此错误。但是即使我收到此错误,模型也会更新。我试着让我的实例方法私有,受保护。但结果是一样的。不知道我在这里错过了什么。
非常感谢您的帮助。
我的模特:
class UserProfile < ApplicationRecord
belongs_to :user
before_update :capitalize_names
# i tried protected or private still gets the same result!!
def capitalize_names
self.first_name = self.first_name.titleize
self.last_name = self.last_name.titleize
end
end
这是我的控制台输出:
irb(main):004:0> u
=> #<User id: 25, username: "somename1", email: "bhati12345@gmail.com", created_at: "2019-09-14 14:09:46", updated_at: "2019-09-14 14:09:46">
irb(main):005:0> u.profile
=> #<UserProfile id: 25, first_name: nil, last_name: nil, user_id: 25, pop_value: nil, time_zone: nil, country: nil, sketch_profile: {}, profile_image: nil, logo: nil, created_at: "2019-09-14 14:09:46", updated_at: "2019-09-14 14:09:46", gender: "male">
irb(main):006:0> u.profile.update(first_name: 'somecool name')
Traceback (most recent call last):
2: from (irb):6
1: from app/models/user_profile.rb:16:in `capitalize_names'
NoMethodError (undefined method `titleize' for nil:NilClass)
但是,如您所见,我的模型仍然成功更新...
irb(main):007:0> u.profile
=> #<UserProfile id: 25, first_name: "Somecool Name", last_name: nil, user_id: 25, pop_value: nil, time_zone: nil, country: nil, sketch_profile: {}, profile_image: nil, logo: nil, created_at: "2019-09-14 14:09:46", updated_at: "2019-09-14 14:10:52", gender: "male">
问题是您第二次调用 titleize
,因为在示例中 self.last_name
是 nil
。您不能在 nil 上调用 titleize,但是您的记录仍然会被修改,因为对 titleize 的第一次调用是针对 self.first_name
这是一个字符串。为避免异常,您可以将两个字段的默认值设置为空字符串,或检查它们是否为 nil
def capitalize_names
self.first_name = self.first_name.try(:titleize)
self.last_name = self.last_name.titleize unless self.last_name.nil?
end
我在这里查看了有关我的错误的问题,但它们似乎无关,因此 post。 我的 UserProfile 模型中有一个 'capitalize_names' 方法,当我在控制台中更新属性时会抛出此错误。但是即使我收到此错误,模型也会更新。我试着让我的实例方法私有,受保护。但结果是一样的。不知道我在这里错过了什么。 非常感谢您的帮助。
我的模特:
class UserProfile < ApplicationRecord
belongs_to :user
before_update :capitalize_names
# i tried protected or private still gets the same result!!
def capitalize_names
self.first_name = self.first_name.titleize
self.last_name = self.last_name.titleize
end
end
这是我的控制台输出:
irb(main):004:0> u
=> #<User id: 25, username: "somename1", email: "bhati12345@gmail.com", created_at: "2019-09-14 14:09:46", updated_at: "2019-09-14 14:09:46">
irb(main):005:0> u.profile
=> #<UserProfile id: 25, first_name: nil, last_name: nil, user_id: 25, pop_value: nil, time_zone: nil, country: nil, sketch_profile: {}, profile_image: nil, logo: nil, created_at: "2019-09-14 14:09:46", updated_at: "2019-09-14 14:09:46", gender: "male">
irb(main):006:0> u.profile.update(first_name: 'somecool name')
Traceback (most recent call last):
2: from (irb):6
1: from app/models/user_profile.rb:16:in `capitalize_names'
NoMethodError (undefined method `titleize' for nil:NilClass)
但是,如您所见,我的模型仍然成功更新...
irb(main):007:0> u.profile
=> #<UserProfile id: 25, first_name: "Somecool Name", last_name: nil, user_id: 25, pop_value: nil, time_zone: nil, country: nil, sketch_profile: {}, profile_image: nil, logo: nil, created_at: "2019-09-14 14:09:46", updated_at: "2019-09-14 14:10:52", gender: "male">
问题是您第二次调用 titleize
,因为在示例中 self.last_name
是 nil
。您不能在 nil 上调用 titleize,但是您的记录仍然会被修改,因为对 titleize 的第一次调用是针对 self.first_name
这是一个字符串。为避免异常,您可以将两个字段的默认值设置为空字符串,或检查它们是否为 nil
def capitalize_names
self.first_name = self.first_name.try(:titleize)
self.last_name = self.last_name.titleize unless self.last_name.nil?
end