Использование ведущих (стиль Райана Бейтса) без связанной модели

Я хотел бы использовать презентаторов (как показано здесь: http://railscasts.com/episodes/287-presenters-from-scratch?view=asciicast) для очистки моих представлений static_pages, но его метод, похоже, опирается на базовую модель, которой у static_pages нет. Могу ли я использовать этот метод для моей статической домашней страницы?

Моя пользовательская установка (которая работает хорошо и имеет соответствующую модель) выглядит следующим образом:

Presenter:

class UserPresenter < BasePresenter
  presents :user
    def h
      @template
    end

    def admin_text
      if user.admin?
        'This is an admin'
      else
       'This is not an admin'
      end
    end
end

Users/Show:

<% present @user do |user_presenter| %>
    <div class="row">
       <dl>
          <dt>Username:</dt>
          <dt><%= @user.username %></dt>
          <dt>Email:</dt>
          <dt><%= @user.email %></dt>
          <dt><%= user_presenter.admin_text %>
        </dl>
    </div>
<% end %>

Я хотел бы использовать аналогичную структуру для очистки партиала _header, отображаемого в application.html.erb, часть которого выглядит так:

from _header.html.erb:

<% if current_user && current_user.admin? %>
  <li><a href="#">All Notes</a></li>
<% end %>

Как я могу использовать ведущего, чтобы переместить эту логику из представления и показать представление примерно так:

static_presenter.admin_all_notes

предъявить необходимый код просмотра home.html.erb?

Я не уверен, что задал этот вопрос наилучшим образом, но моя цель — использовать докладчиков, таких как Райан Бейтс, для очистки моих представлений static_pages, у которых нет соответствующей модели.

Спасибо!

Изменить:

Меня особенно смущает, как обернуть статическую страницу (например, home.html.erb) и что передать в блок, а после этого, как сослаться на метод в классе презентатора со статической страницы.


person jackerman09    schedule 10.12.2013    source источник


Ответы (1)


Вы можете использовать тот же подход. Вам просто нужно будет выбрать имя для презентатора (например, static_presenter), и вы не будете передавать экземпляр модели для инициализации, поскольку вы представляете статическую или глобальную информацию. В остальном подход тот же.

Итак, для вашего нынешнего класса, я думаю, вы могли бы иметь:

class StaticPagesPresenter

  def initialize(template)
    @template = template
    yield self if block_given?
  end

  def h
    @template
  end

  def admin_notes
    if h.current_user && h.current_user.admin?
       '<li><a href="#">All Notes</a></li>'
    end
  end

end

то в частичном заголовке у вас может быть что-то вроде:

<% StaticPagesPresenter.new(self) do |presenter| %>
<%   presenter.admin_notes %>
<% end %>

Я предполагаю, что есть помощники Rails, которые можно использовать в качестве альтернативы HTML, который в настоящее время находится в admin_notes, и я не уверен, нужен ли вам h. для ссылки на current_user.

person Peter Alfvin    schedule 10.12.2013