【问题标题】:Rspec error, "undefined method 'downcase' for nil:NilClass"Rspec 错误,“nil:NilClass 的未定义方法 'downcase'”
【发布时间】:2013-08-01 22:58:48
【问题描述】:

我在运行 Rspec 测试时不断收到此错误,但不知道原因。我对 Rails(以及一般编程)非常陌生,因此非常感谢任何方向或帮助!

编辑:如果有人想筛选和/或复制错误,这里是 repo 的链接。 https://github.com/FluxAnimus/sample_app/tree/sign-up

Failures:

1) User pages profile page 
 Failure/Error: before { visit user_path(user) }
 ActionView::Template::Error:
   undefined method `downcase' for nil:NilClass
 # ./app/helpers/users_helper.rb:5:in `gravatar_for'
 # ./app/views/users/show.html.erb:3:in `_app_views_users_show_html_erb__1766857043046396980_38603940'
 # ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in <top (required)>'

2) User pages profile page 
 Failure/Error: before { visit user_path(user) }
 ActionView::Template::Error:
   undefined method `downcase' for nil:NilClass
 # ./app/helpers/users_helper.rb:5:in `gravatar_for'
 # ./app/views/users/show.html.erb:3:in `_app_views_users_show_html_erb__1766857043046396980_38603940'
 # ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in <top (required)>'

Finished in 0.46129 seconds
39 examples, 2 failures

Failed examples:

rspec ./spec/requests/user_pages_spec.rb:12 # User pages profile page 
rspec ./spec/requests/user_pages_spec.rb:11 # User pages profile page 

我在 Ruby on Rails 教程的第 7.13 章。在我添加 Gravatar 代码和 FactoryGirls Gem 之前,这些测试都顺利通过。

/app/helpers/users_helper.rb 文件

module UsersHelper

  # Returns the Gravatar (http://gravatar.com/) for the given user.
  def gravatar_for(user)
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end

spec/requests/user_pages_spec.rb

require 'spec_helper'

describe "User pages" do

  subject { page }

  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    before { visit user_path(user) }

    it { should have_content(user.name) }
    it { should have_title(user.name) }
  end
.
.
.
end

最后一个参考:app/views/users/show.html.erb

<% provide(:title, @user.name) %>
<h1>
  <%= gravatar_for @user %>
  <%= @user.name %> 
</h1>

这是工厂文件:

FactoryGirl.define do
  factory :user do
    name     "Michael Hartl"
    email    "michael@example.com"
    password "foobar"
    password_confirmation "foobar"
  end
end

app/controllers/users_controller.rb

class UsersController < ApplicationController

    def show
        @user = User.find(params[:id])
    end

    def new
    end
end

【问题讨论】:

    标签: ruby-on-rails rspec railstutorial.org


    【解决方案1】:

    假设您在教程中使用gravatar_for 的定义,downcase 仅在user.email.downcase 的上下文中被引用,这意味着user 已定义,但@ user 的 987654325@ 方法/属性返回 nil。您还可以通过堆栈跟踪中提供的文件名、方法和行号来识别有问题的代码。

    更新:在您的 User 模型中,您有一个 before_save 调用,其中包括以下内容:

    self.email = email.downcase!
    

    由于downcase! 返回nil,这具有将email 设置为nil 的效果。根据本教程,您可以改用以下任一方法:

    self.email.downcase!
    

    或:

    self.email = email.downcase
    

    【讨论】:

    • 是的,我使用的是教程中的定义。我已经在堆栈跟踪中添加了页面。似乎还是找不到问题。再次道歉,我对这一切几乎是全新的。我确定我在这一点上遗漏了一些明显的东西。值得注意的是,当我启动应用程序时,一切似乎都正常工作。
    • 只是把一些东西扔在那里:a)如果你正在使用guard/spork,你是否重新启动它?b)你的测试数据库是最新的(例如rake test:prepare), c) 您的UsersController#show 方法是否正确定义?
    • 我实际上并没有使用guard/spork,尽管我在 Gemfile 中包含了 Gems。我的测试运行得非常快,所以我最终决定不使用它们。我已经用我的用户控制器显示文件更新了这个问题。在我看来是对的,但我肯定是错的。
    • 嗯,我找到了一个解决方案,但我不确定它是否雄辩。无论出于何种原因,我的 user.email 变量不是字符串,所以我将 UsersHelper 文件中的代码更改为读取 gravatar_id = Digest::MD5::hexdigest(user.email.to_s.downcase)
    • 实际上,这只是将nil 对象转换为字符串"nil",所以它不会解决您遇到的任何问题。此外,我从 github 安装了您的存储库,它运行良好。您确定您的测试数据库已设置?无论如何,如果我是你,我会在你的模型中围绕 User 对象创建添加打印语句。
    【解决方案2】:

    你有一个你认为是字符串的变量,但它实际上是nil

    您无法在nil 上调用downcase,因此您会收到此错误。

    欢迎使用 Ruby,您会经常看到它。 :)

    编辑

    我看到您在问题中添加了一些代码。

    正如错误消息所说,它是 user_helper.rb 第 5 行:

    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    

    user.emailnil。我猜你的 FactoryGirl 工厂没有为用户分配电子邮件地址。

    【讨论】:

    • 哈哈,谢谢。我想就是这样,所以我很感激你的确认。关于如何追踪它的任何想法?我检查了我的用户变量,它似乎是一个字符串,它被引用的任何地方。
    • 您的user 变量应该User 类的实例,而不是字符串。最有可能的是,因为我们知道 user.email 评估成功。
    • 编辑我的回答说user.email是罪魁祸首。
    • 太棒了!我也是这么想的。只是不知道现在如何纠正它。有什么建议吗?
    • 我也确保检查工厂。我在原始问题中包含了代码。不过我看不出有什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2012-12-27
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多