1

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

4 回答 4

3

这个问题就像:我应该只在一个部分/视图上使用 I18n 键,还是应该为每种语言使用 X 视图/部分?

没有好的或坏的解决方案。我的意见是,您应该首先使用 <% if admin? %> 等等等等 <% 结束 %>...

然后,如果您的管理员视图与非管理员视图大不相同,请删除条件并创建两个视图:my_view / my_view_admin。

于 2010-11-04T00:40:07.857 回答
2

#192 CanCan 的授权 这个 cancan gem 可以帮助你

于 2011-12-03T07:01:17.773 回答
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 %>

希望这可以帮助。

于 2011-12-05T09:29:50.270 回答
1

保持原样。

你的重复没有那么大。

@current_user.admin?条件将仅与您的解决方案一起运行一次。

如果您放入@current_user.admin?一个共享部分,它将为此集合的每个成员运行。不酷。

于 2011-12-06T19:07:51.927 回答