Rspec错误,“nil的未定义方法’downcase’:NilClass”

我在运行Rspec测试时不断收到此错误,但无法弄清楚原因。 我对Rails(以及一般的编程)都很陌生,所以任何方向或帮助都会非常感激!

编辑:这是一个回购链接,如果有人想筛选和/或复制错误。 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 ' 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 ' 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 

规格/请求/ 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

  

这是工厂文件:

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

应用程序/控制器/ users_controller.rb

 class UsersController < ApplicationController def show @user = User.find(params[:id]) end def new end end 

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

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

 self.email = email.downcase! 

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

 self.email.downcase! 

要么:

 self.email = email.downcase 

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

你不能在nil上调用downcase ,所以你得到这个错误。

欢迎来到Ruby,你会看到很多。 🙂

编辑

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

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

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

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