首页 > 解决方案 > RoR - 如何让管理员在索引页面上显示单个用户文档?

问题描述

我有users#show页面作为管理员,其中列出了所有用户,如下所示:

<% @users.each do |user| %>
  <div class="row row-cols-3">
    <div class="col-2">
      <%= image_tag user.avatar.variant(resize_to_fill: [100, 100]), style: "border-radius: 50%;" %><br>
    </div>
    <div class="col-4">
      <p>user name: <%= user.first_name %> <%= user.last_name %></p>
      <p>user email: <%= user.email %></p>
      <p></p>
    </div>
    <div class="col-4">
      <p>user id: <%= user.id %></p>
      <p></p>
    </div>
    <div class="col-2">
      <%= link_to "Documents", documents_path {:user_id => "#{user.id}" } , class: "btn btn-primary py-1.5 px-3"  %>
    </div>
  </div>
<% end %>

我希望链接到“文档”传递个人 user_id,以便在索引视图中,它只呈现他们的文档。

  def index
    if current_user.admin?
      @user = User.find(params[:user_id])
      @documents = @user.documents
    else
      unless @documents = current_user.documents.where(user_id: current_user).nil?
        @documents = current_user.documents.where(user_id: current_user)
      end
    end
  end

我怎样才能做到这一点?

标签: ruby-on-rails

解决方案


首先,您可以简化编写路线的方式documents_path(user_id: user.id)

<%= link_to "Documents", documents_path(user_id: user.id), class: "btn btn-primary py-1.5 px-3"  %>

在控制器上:

def index
  @documents = Document.where(user_id: params[:user_id]) if params[:user_id]
  # more logic
end

您不需要测试 nil,因为如果您没有所选用户的文档,查询将返回一个空结构。你可能想any?用它:

<% if @documents.any? %>
  <!-- show table -->
<% else %>
  <strong>No documents to display</strong>
<% end %>

我想强调一下,您需要决定是否可以信任用户 ID。例如,如果您在多租户应用程序中,您可能需要确保您可以访问该用户:

def index
  user = Account.users.find(params[:user_id])
  @documents = Document.where(user_id: user.id) if params[:user_id]
  # more logic
end

推荐阅读