如何在整个应用程序视图中全局使用user_helper方法?

时间:2013-04-08 18:04:19

标签: railstutorial.org nomethoderror

我在迈克尔·哈特尔的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很新,所以任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:0)

将该方法放在ApplicationHelper中而不是UserHelper中。以下是我在自己的应用中执行的类似示例:https://github.com/NatashaTheRobot/tinysale/blob/master/app/helpers/application_helper.rb