ActionView::Template::Error: undefined method `email' for nil:NilClass
ActionView::Template::Error: undefined method `email' for nil:NilClass
我是 Rails 的新手,正在编写 Michael Hartl 的教程。我在第 7 章,一切都测试得很好,直到我……说实话,我不知道。一秒钟没问题,然后我添加了 gravatar_for,现在我失败了。我在这里四处寻找答案,有些人提到把 !在 downcase 之后不起作用。这是我收到的错误消息。我知道它就在我面前,但在花了两天时间之后,我觉得这是下一步。当我 运行 bundle exec rake test 我收到这个:
ERROR["test_should_get_about", StaticPagesControllerTest, 2015-09-09 15:14:50 +0000]
test_should_get_about#StaticPagesControllerTest (1441811690.06s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `email' for nil:NilClass
app/helpers/users_helper.rb:5:in `gravatar_for'
app/views/static_pages/about.html.erb:13:in `_app_views_static_pages_about_html_erb__2581941383523300906_55646340'
test/controllers/static_pages_controller_test.rb:22:in `block in <class:StaticPagesControllerTest>'
app/helpers/users_helper.rb:5:in `gravatar_for'
app/views/static_pages/about.html.erb:13:in `_app_views_static_pages_about_html_erb__2581941383523300906_55646340'
test/controllers/static_pages_controller_test.rb:22:in `block in <class:StaticPagesControllerTest>'
20/20: [======] 100% Time: 00:00:00, Time: 00:00:00
这是我的 app/helpers/user_helper.rb
module UsersHelper
# Returns the Gravatar for the given user.
def gravatar_for(user, options = { size: 80 })
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
size = options[:size]
gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
image_tag(gravatar_url, alt: user.name, class: "gravatar")
end
end
这是我的 app/views/static_pages/about.html.erb
<% provide(:title, "About") %>
<h1>About</h1>
<p>
The <a href="http://www.railstutorial.org/"><em>Ruby on Rails
Tutorial</em></a> is a
<a href="http://www.railstutorial.org/book">book</a> and
<a href="http://screencasts.railstutorial.org/">screencast series</a>
to teach web development with
<a href="http://rubyonrails.org/">Ruby on Rails</a>.
This is the sample application for the tutorial.
</p>
<%= gravatar_for User.first, size: 50 %>
<%= gravatar_for User.first, size: 200 %>
<%= gravatar_for User.first, size: 80 %>
<%= gravatar_for User.first %>
这是我的 test/controllers/static_pages_controller_test.rb
require 'test_helper'
class StaticPagesControllerTest < ActionController::TestCase
def setup
@base_title = "Ruby on Rails Tutorial Sample App"
end
test "should get home" do
get :home
assert_response :success
assert_select "title", "Ruby on Rails Tutorial Sample App" end
test "should get help" do
get :help
assert_response :success
assert_select "title", "Help | #{@base_title}"
end
test "should get about" do
get :about
assert_response :success
assert_select "title", "About | #{@base_title}"
end
test "should get contact" do
get :contact
assert_response :success
assert_select "title", "Contact | #{@base_title}"
end
end
非常感谢任何帮助!
在您的 about.html.erb 中您有代码:
<%= gravatar_for User.first, size: 50 %>
<%= gravatar_for User.first, size: 200 %>
<%= gravatar_for User.first, size: 80 %>
<%= gravatar_for User.first %>
这将尝试从数据库中读取并找到第一个用户。
该用户似乎不存在,我不记得 rails 教程中有该代码(如果有误,请纠正我)。静态页面测试应该独立于任何用户,我不明白为什么你首先想要关于站点上的用户图片:)
简而言之:删除提到的代码,它应该 运行 没问题。
您的测试数据库中没有用户,因此在尝试呈现
时 User.first
是 nil
<%= gravatar_for User.first, size: 50 %>
nil
因此作为 user
传递给 gravatar_for
助手,后者调用 email
方法:
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
这会导致错误。
解决方案:
- 确保
user
存在于 gravatar_for
助手中。
- 用至少一个用户填充你的测试数据库。
我是 Rails 的新手,正在编写 Michael Hartl 的教程。我在第 7 章,一切都测试得很好,直到我……说实话,我不知道。一秒钟没问题,然后我添加了 gravatar_for,现在我失败了。我在这里四处寻找答案,有些人提到把 !在 downcase 之后不起作用。这是我收到的错误消息。我知道它就在我面前,但在花了两天时间之后,我觉得这是下一步。当我 运行 bundle exec rake test 我收到这个:
ERROR["test_should_get_about", StaticPagesControllerTest, 2015-09-09 15:14:50 +0000]
test_should_get_about#StaticPagesControllerTest (1441811690.06s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `email' for nil:NilClass
app/helpers/users_helper.rb:5:in `gravatar_for'
app/views/static_pages/about.html.erb:13:in `_app_views_static_pages_about_html_erb__2581941383523300906_55646340'
test/controllers/static_pages_controller_test.rb:22:in `block in <class:StaticPagesControllerTest>'
app/helpers/users_helper.rb:5:in `gravatar_for'
app/views/static_pages/about.html.erb:13:in `_app_views_static_pages_about_html_erb__2581941383523300906_55646340'
test/controllers/static_pages_controller_test.rb:22:in `block in <class:StaticPagesControllerTest>'
20/20: [======] 100% Time: 00:00:00, Time: 00:00:00
这是我的 app/helpers/user_helper.rb
module UsersHelper
# Returns the Gravatar for the given user.
def gravatar_for(user, options = { size: 80 })
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
size = options[:size]
gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
image_tag(gravatar_url, alt: user.name, class: "gravatar")
end
end
这是我的 app/views/static_pages/about.html.erb
<% provide(:title, "About") %>
<h1>About</h1>
<p>
The <a href="http://www.railstutorial.org/"><em>Ruby on Rails
Tutorial</em></a> is a
<a href="http://www.railstutorial.org/book">book</a> and
<a href="http://screencasts.railstutorial.org/">screencast series</a>
to teach web development with
<a href="http://rubyonrails.org/">Ruby on Rails</a>.
This is the sample application for the tutorial.
</p>
<%= gravatar_for User.first, size: 50 %>
<%= gravatar_for User.first, size: 200 %>
<%= gravatar_for User.first, size: 80 %>
<%= gravatar_for User.first %>
这是我的 test/controllers/static_pages_controller_test.rb
require 'test_helper'
class StaticPagesControllerTest < ActionController::TestCase
def setup
@base_title = "Ruby on Rails Tutorial Sample App"
end
test "should get home" do
get :home
assert_response :success
assert_select "title", "Ruby on Rails Tutorial Sample App" end
test "should get help" do
get :help
assert_response :success
assert_select "title", "Help | #{@base_title}"
end
test "should get about" do
get :about
assert_response :success
assert_select "title", "About | #{@base_title}"
end
test "should get contact" do
get :contact
assert_response :success
assert_select "title", "Contact | #{@base_title}"
end
end
非常感谢任何帮助!
在您的 about.html.erb 中您有代码:
<%= gravatar_for User.first, size: 50 %>
<%= gravatar_for User.first, size: 200 %>
<%= gravatar_for User.first, size: 80 %>
<%= gravatar_for User.first %>
这将尝试从数据库中读取并找到第一个用户。 该用户似乎不存在,我不记得 rails 教程中有该代码(如果有误,请纠正我)。静态页面测试应该独立于任何用户,我不明白为什么你首先想要关于站点上的用户图片:)
简而言之:删除提到的代码,它应该 运行 没问题。
您的测试数据库中没有用户,因此在尝试呈现
时User.first
是 nil
<%= gravatar_for User.first, size: 50 %>
nil
因此作为 user
传递给 gravatar_for
助手,后者调用 email
方法:
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
这会导致错误。
解决方案:
- 确保
user
存在于gravatar_for
助手中。 - 用至少一个用户填充你的测试数据库。