0

我完成了 Michael Hartl 的 Rails 教程的第 8 章,所以我设置了应用程序来注册用户并登录和注销。

我正在尝试在 application.html.erb 中使用 User Helper 方法(或更具体地说,在 _header.html.erb 部分中)。

我想使用 gravatar_for 方法(在 user_helper.rb 中定义)来显示用户的 gravatar 图片和用户名,而不是在下拉菜单中使用“Account”一词。

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>

这会在他们的个人资料页面上显示用户的头像和姓名。所以我试图做的是像这样将这些相同的方法添加到部分标题中;

<% 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页面上显示得很好,我假设这是因为它在Users 控制器上的显示操作。但是,当我尝试单击主页或用户视图之外的任何其他页面时,我会收到错误消息

NoMethodError in Pages#about
undefined method `email' for nil:NilClass

所以我想我的问题是如何使方法的gravatar@user.name可用于整个应用程序的所有视图。我觉得答案应该相当简单,但我对 Rails 很陌生,所以任何帮助将不胜感激!

4

1 回答 1

0

Put the method in the ApplicationHelper instead of the UserHelper. Here is an example of something similar I did in my own app: https://github.com/NatashaTheRobot/tinysale/blob/master/app/helpers/application_helper.rb

于 2013-04-08T23:02:33.913 回答