我在运行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
答案 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.email
是nil
。我猜你的FactoryGirl工厂没有为用户分配电子邮件地址。