【问题标题】:undefined method `+' for nil:NilClass in RailsRails 中 nil:NilClass 的未定义方法“+”
【发布时间】:2016-06-30 01:00:57
【问题描述】:

在我models下的user.rb文件中,我定义了一个方法full-name,并在我的视图中调用了这个方法。它引发了我不知道如何解决的错误。

NoMethodError in Statuses#index
Showing app/views/layouts/application.html.erb where line #24 raised:
undefined method `+' for nil:NilClass
Extracted source (around line #10):

def full_name
  first_name + " " + last_name
end

Rails.root:

Application Trace | Framework Trace | Full Trace
app/models/user.rb:10:in `full_name'
app/views/layouts/application.html.erb:24:in `_app_views_layouts_application_html_erb__1801360389632919652_70105866374460'
<li>
  <%= link_to current_user.full_name, edit_user_registration_path %>
</li>

【问题讨论】:

  • full-name 是无效的方法名称。你有什么问题?

标签: ruby-on-rails ruby


【解决方案1】:

您的first_name 属性包含nil

由于NilClass 没有实现+ 方法,它会引发错误。一种处理方法是将值转换为字符串:

first_name.to_s + " " + last_name.to_s

但更好的惯用方法是使用字符串插值:

def full_name
  "#{first_name} #{last_name}"
end

要查看包含在变量中的实际值,您可以使用

puts first_name

但是,由于nil 值在打印时会变成一个空字符串,所以它看起来与"" 一样,是一个空字符串。要查看打印时值是否真的是nil,可以使用

puts first_name.nil?
# => true

puts first_name.class
# => NilClass

【讨论】:

  • 那是否意味着字符串+字符串无效?
  • 否,这意味着nil + 字符串无效。
【解决方案2】:

您的代码是正确的,只是您在 first_name(和/或空 last_name)中有一个(或多个)空值记录。 正如 Nic 解释的那样,Ruby 没有从 nil 到字符串的自动转换,但我想你想为这些字段设置一些值,所以我建议你对它们使用适当的验证:

class User < ActiveRecord::Base
  validates :first_name, :last_name, presence: true
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2013-01-25
    相关资源
    最近更新 更多