我在迈克尔·哈特尔的Rails教程中完成了chapter 8,所以我设置了应用程序以便用户注册登录和退出。
我正在尝试在application.html.erb中使用User Helper方法(或者更具体地说,在_header.html.erb部分内)。
我想使用gravatar_for方法(在user_helper.rb中定义)来显示用户的重力图片和用户名,而不是在下拉列表中显示“帐户”一词。
module UsersHelper
# Returns the Gravatar for the given user.
def gravatar_for(user, options = { size: 150})
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
size = options[:size]
gravatar_url = "http://gravatar.com/avatar/#{gravatar_id}?s=#{size}"
image_tag(gravatar_url, alt: user.name, class: "gravatar")
end
end
在show.html.erb页面上,我有以下代码
<% provide(:title, @user.name ) %>
<div class="row">
<aside class="span6">
<section>
<h1>
<%= gravatar_for @user %>
<%= @user.name %>
</h1>
</section>
</aside>
</div>
这会在用户个人资料页面上显示用户的重头和名称。所以我试图将那些相同的方法添加到 header partial 中,就像这样;
<% if signed_in? %>
<li id="fat-menu" class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<span id="small">
<%= gravatar_for @user %><%= @user.name %><b class="caret"></b>
</span>
</a>
<ul class="dropdown-menu">
<li><%= link_to "Profile", current_user %></li>
<li><%= link_to "Settings", '#' %></li>
<li class="divider"></li>
<li><%= link_to "Sign out", signout_path, method: "delete" %></li>
</ul>
</li>
<% else %>
<li id="cta"><%= link_to "+ Sign up", signup_path %></li>
<li><%= link_to "Sign in", signin_path %></li>
<% end %>
该代码在 show.html.erb 页面上显示完全正常,我假设是因为用户控制器上的 show action 。但是,当我尝试单击主页或用户视图之外的任何其他页面时,我收到错误
NoMethodError in Pages#about
undefined method `email' for nil:NilClass
所以我想我的问题是我如何制作 gravatar for 方法, @ user.name 可用于所有整个视图应用程序。我觉得答案应该相当简单,但我对rails很新,所以任何帮助都会非常感激!
答案 0 :(得分:0)
将该方法放在ApplicationHelper中而不是UserHelper中。以下是我在自己的应用中执行的类似示例:https://github.com/NatashaTheRobot/tinysale/blob/master/app/helpers/application_helper.rb