帮助我重构我的管理员用户视图与非管理员用户视图

时间:2010-11-03 23:41:28

标签: ruby-on-rails actionview

如果登录的用户是管理员,我有一个显示编辑按钮和一堆额外信息的书籍列表。现在我有两个单独的部分,根据登录的用户类型进行渲染。我曾经只有一个部分带有一堆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 %>   

4 个答案:

答案 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?放在共享部分中,则会为此集合的每个成员运行它。不酷。