簡體   English   中英

ActionView :: Template :: Error:nil:NilClass的未定義方法'email'

[英]ActionView::Template::Error: undefined method `email' for nil:NilClass

我是Rails的新手,正在研究Michael Hartl的教程。 我在第7章,一切都進行得很好,直到我...好吧,我真的不知道。 一秒鍾的罰款,然后我添加了gravatar_for,現在我失敗了。 我在這里四處尋找答案,有人提到放一個! 失敗后,這是行不通的。 這是我收到的錯誤消息。 我知道它就在我眼前,但是花了兩天時間才想到這是下一步。 當我運行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 %>

這是我的測試/控制器/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教程中的代碼(如果出錯,請更正)。 靜態頁面測試應該獨立於任何用戶,並且我不明白為什么首先要在about網站上獲取用戶圖片:)

簡而言之:刪除提到的代碼,它應該可以正常運行。

您的測試數據庫中沒有用戶,因此嘗試渲染時User.firstnil

<%= gravatar_for User.first, size: 50 %>

因此, nil作為user傳遞給了gravatar_for助手,該助手在其上調用email方法:

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

這會導致錯誤。

解決方案:

  • 確保usergravatar_for幫助器中。
  • 用至少一個用戶填充測試數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM