0

モデル:project.rb

def groups_by_role
    member_principals.find(:all, :include => [:principal, :roles]).inject({}) do |h, m|
      m.roles.each do |r|
        h[r] ||= []
        h[r] << m.principal
      end
      h
    end
  end

コントローラー:projects_controller.rb

@groups_by_role = @project.groups_by_role

ビュー:members_index.html.rb

<% if @groups_by_role.any? %>
<div class="members box">
    <h3><%= l(:label_member_plural)%></h3>
    <p>
        <% @groups_by_role.keys.sort.each do |role| %>
        <%= h role %>: <%= @groups_by_role[role].sort.collect{|u| u}.join(", ").html_safe %>
        <br />
        <% end %>
    </p>
</div>
<% end %>

すべてのロールとプリンシパルを検索するメソッドgroup_by_roleを持つモデルがあります。ここで、プリンシパルは、特定のロールに属するユーザーとグループを定義します。このメソッドはproject.rbの一部です。

後で、コントローラーで同じメソッドをプロジェクトに定義し、それをインスタンス変数に割り当てて、ビューで使用できるようにします。つまり、@groups_by_roleです。

最後に、特定のユーザーとグループの役割を収集して表示します。

特定の@projectのコンソールからの出力は、次のようになります。@groups_by_role

{#<Role id: 18, name: "Project Manager", permissions: [:add_project, :edit_project, :close_project], issues_visibility: "all">=>[#<User id: 11, login: "test1", firstname: "Test", lastname: "T", type: "User">], 

#<Role id: 26, name: "Readers", permissions: [:view_documents, :view_files], issues_visibility: "default">=>[#<Group id: 835, login: "", firstname: "", lastname: "AA", type: "Group">, #<User id: 107, login: "testab", firstname: "Tommy", lastname: "Ab", type: "User">, #<User id: 111, login: "testxyz", hashed_password: "", firstname: "test", lastname: "xyz", type: "User">]}

@groups_by_role.class=ハッシュ

質問:ロールとそれぞれのユーザーまたはグループで出力を取得しています。ただし、ここで表示を変更したいと思います。ハッシュにグループのないユーザーのみが含まれている場合は、ユーザーのみを表示します。したがって、この出力{#<Role id: 18, name: "Project Manager", permissions: [:add_project, :edit_project, :close_project], issues_visibility: "all">=>[#<User id: 11, login: "test1", firstname: "Test", lastname: "T", type: "User">], ではユーザーのみが含まれているため、ユーザーを表示します。これは、ユーザーのみがあり、グループはないため、正常に機能します...

しかし、ハッシュにユーザーとグループの両方が含まれている場合は、グループ名のみを表示し、ユーザーは表示しません。現在、次の例のようにユーザーとグループが表示されます。#<Role id: 26, name: "Readers", permissions: [:view_documents, :view_files], issues_visibility: "default">=>[#<Group id: 835, login: "", firstname: "", lastname: "AA", *type: "Group"*>, #<User id: 107, login: "testab", firstname: "Tommy", lastname: "Ab", *type: "User"*>, #<User id: 111, login: "testxyz", hashed_password: "", firstname: "test", lastname: "xyz", type: "User">]}

ビューまたはコントローラー内で条件を渡し、ハッシュがユーザーとグループの両方を返すかどうかを確認する方法はありますか?グループのみを表示する必要があります。誰かがこれで私を助けてくれますか?どんな助けでも本当にありがたいです。

4

1 に答える 1

2

私はあなたを正しく理解したと思います。

次のような文字列を返すヘルパーメソッド(コントローラー用)を作成します。

def print_principals(principals)
  if principals.index {|p| p.is_a? Group }
    principals = principals.reject{|u| u.is_a? User }
  end
  # WARNING!!! You should apply html_safe only if you're sure that it 
  # is actually safe, i.e. not input by user. Otherwise consider escaping it.
  principals.sort.collect{|u| u}.join(", ").html_safe 
end

あなたの見解では: <%= h role %>: <%= print_principals @groups_by_role[role] %>

于 2013-03-20T09:40:28.673 に答える