在活动供稿中,我们正在尝试列出重力图像,但仍然会遇到错误信息。
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
如果我们移除 当直接从users_controller生成视图时,正确显示gravatar图像。用户 我非常感谢您的时间和时间。专业知识!undefined method `email' for nil:NilClass
Line: if user.email.nil?
.email
,则会显示.name
的错误消息。如果我们删除它,那么错误消息就会消失,但只会显示默认的重力图像而不是用户的自定义图像。has_many :activities
和活动belongs_to :user
之间存在模型关系。class ActivitiesController < ApplicationController
def index
@activities = Activity.order("created_at desc").where(current_user.following_ids)
end
end
答案 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)
即使没有用户登录(例如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