如何使用Helper向Feed显示Gravatars?

时间:2015-04-21 23:11:27

标签: ruby-on-rails ruby null 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

中的

NoMethodError

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

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

当直接从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

我非常感谢您的时间和时间。专业知识!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

即使没有用户登录(例如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