如何使用 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 %>
您似乎希望即使没有用户登录也能调用此方法(又名 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
在活动提要上,我们试图列出 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 %>
您似乎希望即使没有用户登录也能调用此方法(又名 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