Как использовать помощник, чтобы показать Gravatars с Feed?

В ленте действий мы пытаемся перечислить граватационные изображения, но продолжаем сталкиваться с сообщением об ошибке.

index.html.erb

<% @activities.each do |activity| %>
    <%= gravatar_for @user, size: 50 %>
<% end %>

модуль UsersHelper

# Returns the Gravatar for the given user.
def gravatar_for(user, options = { size: 80 })

    if user.email.nil? #creates error
    gravatar_id = Digest::MD5::hexdigest((0...8).map { (65 + rand(26)).chr }.join+"@mailinator.com")
    else
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    end

  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

NoMethodError в Деятельности #index

undefined method `email' for nil:NilClass
Line: if user.email.nil?

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

Граватарные изображения отображаются правильно, когда представления генерируются непосредственно из users_controller. Существует модель отношений пользователя has_many :activities и деятельность belongs_to :user,

class ActivitiesController < ApplicationController
    def index
        @activities = Activity.order("created_at desc").where(current_user.following_ids)
    end
end

Я высоко ценю ваше время и опыт!

2 ответа

Решение

Кажется, что вы хотите иметь возможность вызывать этот метод, даже если нет пользователя, вошедшего в систему (иначе user является nil). Вы можете обойти эту проблему, определив анонимного пользователя. Самая простая версия может выглядеть так:

def gravatar_for(user, options = { size: 80 })

  unless user
    identifier = Array.new(8) { ('a'..'z').to_a.sample }.join
    user = User.new(name: 'Anonymous', email: "#{identifier}@mailinator.com")
  end

  gravatar_id  = Digest::MD5::hexdigest(user.email.downcase)
  gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{options[:size]}"
  image_tag(gravatar_url, alt: user.name, class: "gravatar")
end

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

undefined method `email' for nil:NilClass
Line: if user.email.nil?

Я предполагаю, что это ошибка копирования и вставки, и вы ищете что-то вроде:

<% @activities.each do |activity| %>
  <%= gravatar_for activity.user, size: 50 %>
<% end %>

В этом случае вам может потребоваться добавить условие, чтобы избежать ошибки, если есть действие без пользователя:

<% @activities.each do |activity| %>
  <%= gravatar_for activity.user, size: 50 if activity.user %>
<% end %>
Другие вопросы по тегам