我想使用演示程序(如这里所示: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那样使用演示程序来清理我的static_pages视图,这些视图没有相应的模型。
谢谢!
编辑:
我对如何包装静态页面(例如home.html.erb
)和传递给块的内容特别感到困惑,接下来是如何从静态页面引用演示器类中的方法。
发布于 2013-12-10 12:27:50
你可以用同样的方法。您只需要为演示者选择一个名称(例如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
。
https://stackoverflow.com/questions/20503445
复制相似问题