如果登录的用户是管理员,我有一个显示编辑按钮和一堆额外信息的书籍列表。现在我有两个单独的部分,根据登录的用户类型进行渲染。我曾经只有一个部分带有一堆if if.admin?陈述,但它开始变得丑陋。现在我正在处理两个文件,每个文件中都有少量重复数据。有没有更好的方法呢?
index.html.erb
<ul>
<% if @current_user.admin? %>
<%= render :partial => "book", :collection => @books %>
<% else %>
<%= render :partial => "non_admin_book", :collection => @books %>
<% end %>
</ul>
_book.html.erb
Title: <%= book.title %> EDIT BUTTON
<!-- Awesome extra info for admins -->
Author: <%= book.author %>
<!-- Awesome extra info for admins -->
_non_adminbook.html.erb
Title: <%= book.title %>
Author: <%= book.author %>
答案 0 :(得分:3)
这个问题就像:我应该只在一个部分/视图中使用I18n键,还是应该为每种语言使用X视图/部分?
没有好的或坏的解决方案。我的意见是你应该首先使用条件,如&lt;%if admin? %GT; blah blah&lt;%end%&gt; ...
然后,如果您的管理员视图与非管理员视图不同,请删除条件并制作两个视图:my_view / my_view_admin。
答案 1 :(得分:2)
#192 Authorization with CanCan这个康康宝石可以帮助你
答案 2 :(得分:2)
我真的不喜欢任何重复,但有时它是最简单的解决方案。
在你的情况下,我可以告诉你
通常我会使用on_the_spot gem进行内联编辑,然后我会使用这样的帮助器:
def on_the_spot_edit_if_allowed(object, field, options)
if current_user.admin?
on_the_spot_edit object, field, options
else
object.send(field)
end
end
在这种情况下,我的观点变得像
Title: <%= on_the_spot_edit_if_allowed book, title %>
<%- if current_user.admin? %>
<!-- Awesome extra info for admins -->
<% end %>
Author: <%= book.author %>
<%- if current_user.admin? %>
<!-- Awesome extra info for admins -->
<% end %>
除非是(设计/ UI限制)不可能,否则我会将该视图重构为以下内容:
Title: <%= on_the_spot_edit_if_allowed book, title %>
Author: <%= book.author %>
<%- if current_user.admin? %>
<%= render :partial => 'extra_admin_fields'
<% end %>
希望这有帮助。
答案 3 :(得分:1)
保持原状。
你的副本不是那么大。
@current_user.admin?
条件只会在您的解决方案中运行一次。
如果您将@current_user.admin?
放在共享部分中,则会为此集合的每个成员运行它。不酷。