【问题标题】:Using presenters (Ryan Bates' style) without an associated model使用没有关联模型的演示者(Ryan Bates 的风格)
【发布时间】:2013-12-28 11:59:37
【问题描述】:

我想使用演示者(如这里所示: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提供必要的查看代码?

我不确定我是否以最好的方式提出了这个问题,但我的目标是使用像 Ryan Bates 这样的演示者来清理我的 static_pages 视图,这些视图没有相应的模型。

谢谢!

编辑:

我对如何包装静态页面(例如home.html.erb)以及传递给块的内容以及如何从静态页面引用演示者类中的方法感到特别困惑。

【问题讨论】:

    标签: ruby-on-rails ruby railscasts presenter


    【解决方案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 帮助程序可以用作 admin_notes 中当前 HTML 的替代品,我不确定您是否需要 h. 来引用 current_user

    【讨论】:

      最近更新 更多