Как использовать метод user_helper глобально во всех представлениях приложения?

Я закончил главу 8 в учебнике Майкла Хартла по Rails Tutorial, поэтому я приложение настроено для регистрации пользователей, входа и выхода.

То, что я пытаюсь сделать, использует метод User Helper внутри application.html.erb (или, точнее, внутри частичного _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>

И это показывает граватар пользователя и имя на странице его профиля. Итак, что я попытался сделать, так это добавить те же самые методы в частичный заголовок, например так;

<% 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 доступными для всех представлений во всем приложении. Я чувствую, что ответ должен быть довольно простым, но я новичок в рельсах, поэтому любая помощь будет очень признательна!


person Mackenzie    schedule 08.04.2013    source источник


Ответы (1)


Поместите метод в ApplicationHelper вместо UserHelper. Вот пример того, что я сделал в своем приложении: https://github.com/NatashaTheRobot/tinysale/blob/master/app/helpers/application_helper.rb

person NatashaTheRobot    schedule 08.04.2013