1

运行我的 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
4

2 回答 2

5

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

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

self.email = email.downcase!

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

self.email.downcase!

或者:

self.email = email.downcase
于 2013-08-01T23:38:38.720 回答
0

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

你不能打电话downcasenil所以你得到这个错误。

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

编辑

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

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

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

就是user.email这样nil。我猜您的 FactoryGirl 工厂没有为用户分配电子邮件地址。

于 2013-08-01T23:07:19.360 回答