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

时间:2013-08-01 22:58:49

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

我在运行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 <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

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

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

class UsersController < ApplicationController

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

    def new
    end
end

2 个答案:

答案 0 :(得分:4)

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

更新:在nil模型中,您进行了User来电,其中包括以下内容:

before_save

由于self.email = email.downcase! 返回downcase!,因此可以将nil设置为email。根据教程,您可以使用以下任一方法:

nil

或:

self.email.downcase!

答案 1 :(得分:0)

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

您无法在downcase上致电nil,因此您收到此错误。

欢迎使用Ruby,你会看到很多。 :)

修改

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

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

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

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