【问题标题】:Help me refactor my admin user views vs. non admin user views帮助我重构我的管理员用户视图与非管理员用户视图
【发布时间】:2010-11-03 23:41:28
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails actionview


    【解决方案1】:

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

    没有好的或坏的解决方案。我的意见是,您应该从使用 等等等等 ...

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

    【讨论】:

      【解决方案2】:

      #192 Authorization with CanCan这个cancan gem可以帮助你

      【讨论】:

        【解决方案3】:

        我真的不喜欢任何形式的重复,但有时这是最简单的解决方案。

        在你的情况下,我可以告诉你

        • 管理员可以选择编辑字段(内联?)
        • 管理员查看更多字段

        通常我使用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 %>
        

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          保持原样。

          你的重复没有那么大。

          @current_user.admin? 条件只会在您的解决方案中运行一次。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-13
            • 2020-07-21
            • 1970-01-01
            • 2015-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多