如何使用 Helper 通过 Feed 显示头像?

How to use Helper to show Gravatars with Feed?

在活动提要上,我们试图列出 gravatar 图片,但将 运行 保留在错误消息中。

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

活动中没有方法错误#index

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

如果我们删除 .email,则会显示 .name 的错误。如果我们也删除它,那么错误消息就会消失,但只会显示默认的 gravatar 图片,而不是用户的自定义图片。

当视图直接从 users_controller 生成时,gravatar 图像可以正确显示。存在用户has_many :activities和活动belongs_to :user.

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

非常感谢您的宝贵时间和专业知识!

您遇到的错误是因为您没有检查是否确实有用户为其打印 gravitar。

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

我猜这是一个复制粘贴错误,您正在寻找类似的东西:

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

在这种情况下,如果 activity 没有用户,您可能需要添加条件以避免错误:

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

您似乎希望即使没有用户登录也能调用此方法(又名 usernil)。您可以通过定义匿名用户来解决这个问题。最简单的版本可能如下所示:

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