gravatar_for нет ошибки метода Hartl rails глава 7

Все работало нормально, пока я не попытался определить gravatar_for и вызвать его. user.email.downcase — нулевой класс. Ниже то, с чем я работаю. Дайте мне знать, если вам нужна какая-либо другая информация.

Я вижу при запуске localhost по адресу http://localhost:3000/users/1 NoMethodError in Users#show

`Showing /Users/nathandewaele/Desktop/workspce/static_pages/app/views/users/show.html.erb where line #6 raised:

undefined method `downcase' for nil:NilClass`

извлеченный исходный код вокруг строки 5 gravatar_id = Digest::MD5::hexdigest(user.email.downcase)

`Rails.root: /Users/nathandewaele/Desktop/workspce/static_pages

Application Trace | Framework Trace | Full Trace
app/helpers/users_helper.rb:5:in `gravatar_for'
app/views/users/show.html.erb:6:in `_app_views_users_show_html_erb___4114710587947303689_70365956197180'
Request

Parameters:

{"id"=>"1"}
Toggle session dump
Toggle env dump
Response

Headers:

None`

приложение/помощники/users_helper.rb

```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
```

приложение/контроллеры/users_controller.rb

```ruby

class UsersController < ApplicationController

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

  def new
        @user = User.new
  end
end
```

приложение/дб/schema.rb

```ruby

ActiveRecord::Schema.define(version: 20171108202327) do

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "password_digest"
    t.index ["email"], name: "index_users_on_email", unique: true
  end

end
```

приложение/контроллеры/config/routes.rb

```ruby

Rails.application.routes.draw do

  # get '/new', to: 'users#new'
    get '/show', to: 'users#show'
    get  '/help', to: 'static_pages#help'
    get '/about', to: 'static_pages#about'
    get '/contact', to: 'static_pages#contact'
    get  '/signup',  to: 'users#new'

    resources :users
end
```

приложение/представления/пользователи/show.html.erb

```erb

<% provide(:title, @user.name) %>
<div class="row">
  <aside class="col-md-4">
    <section class="user_info">
      <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
      </h1>
    </section>
  </aside>
</div>
```

скриншот ошибки


person Naters    schedule 18.11.2017    source источник
comment
Пожалуйста, проверьте пользовательский объект в методе gravatar_for, похоже, что электронная почта отсутствует, поэтому нижний регистр выдает ошибку.   -  person Pulkit Agarwal    schedule 18.11.2017
comment
Когда user.email.downcase вызывает ошибку undefined method downcase for nil`, чем user.email, очевидно, возвращает nil. У вашего пользователя в базе данных нет электронной почты. Исправьте это, и ошибка исчезнет.   -  person spickermann    schedule 18.11.2017
comment
Спикерманн - ты прав! но я только что создал экземпляр нового пользователя, и электронная почта отображается как ноль. => #<ActiveRecord::Relation [#<User id: 1, name: "Naters", email: nil, created_at: "2017-11-17 22:58:34", updated_at: "2017-11-17 22:58:34", password_digest: "$2a$10$oRTXEUFarNBBV7ziJWG7/uIb20wiYR8ghB8dHRrtVAg...">, #<User id: 2, name: "Naters", email: nil, created_at: "2017-11-18 16:27:45", updated_at: "2017-11-18 16:27:45", password_digest: "$2a$10$BwF.FJmluyHiTeME96zpnekI6pWngXdYnUq8iihpspc...">]>   -  person Naters    schedule 18.11.2017
comment
Почему моя электронная почта не отображается, когда я ее ввожу?   -  person Naters    schedule 19.11.2017


Ответы (2)


Была такая же проблема, решенная, когда я обновил /app/helpers/users_helper с кодом:

  # Returns the Gravatar 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

(как показано в листинге 7.9)

person Maayan Naveh    schedule 11.02.2018
comment
Это было слишком полезно. Спасибо - person Denny; 10.01.2020

У меня была такая же проблема, которую было трудно отследить! Как упоминалось выше, электронное письмо не было отправлено в базу данных. Моя проблема решилась сама собой после того, как я изменил код в файле model/users.rb, с которым я себя путал: before_save { self.email = email.downcase }.

Прежде чем я использовал before_save { self.email = email.downcase! }. Валидация находится в Главе 6 Учебника по Rails. Как-то я запутался email.downcase! с self.email = email.downcase.

Это по-прежнему оставляет загадкой, почему учетная запись была создана без электронной почты, а не из-за ошибки, мешающей мне продолжить...

person ak_amy    schedule 07.01.2018