2

わかりましたので、次の設定があり、方向性が必要です。この問題でほぼ 2 日を無駄にしてしまったので、先に進む必要があります。

したがって、役割と許可は、RolePermissions Role -> RolePermission -> Permission によって関連付けられます。

すべての役割と権限を同時に編集できるチェックボックスのグリッドを作成しようとしています。

これは私が視覚的に探しているものです:ロール / パーミッション チェックボックス グリッド

どんな助けでも大歓迎です!また、simple_form と bootstrap を使用しています。

4

2 に答える 2

2

これを試して、

# /config/routes.rb

resources :roles do
  collection do
    get :edit_multiple
    put :update_multiple
  end
end


# /app/controllers/roles_controller.rb

class RolesController < ApplicationController
  def edit_multiple
    @roles = Role.all
    @permissions = Permission.all
  end

  def update_multiple
    params[:roles] = {} unless params.has_key?(:roles) # if all checkboxes unchecked.
    Role.all.each do |role|
      # this allows for 0 permission checkboxes being checked for a role.
      unless params[:roles].has_key?(role.id.to_s)
        params[:roles][role.id] = { permission_ids: [] }
      end
    end
    @roles = Role.update(params[:roles].keys, params[:roles].values)
    @roles.reject! { |r| r.errors.empty? }
    if @roles.empty?
      redirect_to edit_multiple_roles_path
    else
      render :edit_multiple
    end
  end
end


# /app/views/roles/edit_multiple.html.erb

<%= form_tag update_multiple_roles_path, method: :put do %>
  <table>
    <tr>
      <th></th>
      <% @permissions.each do |permission| %>
        <th><%= permission.name %></th>
      <% end %>
    </tr>
    <% @roles.each do |role| %>
      <tr>
        <th><%= role.name %></th>
        <% @permissions.each do |permission| %>
          <td><%= check_box_tag "roles[#{role.id}][permission_ids][]", permission.id, role.permissions.include?(permission) %></td>
        <% end %>
      </tr>
    <% end %>
  </table>

  <%= submit_tag "Save" %>
<% end %>


# /app/models/role.rb

class Role < ActiveRecord::Base
  has_many :role_permissions
  has_many :permissions, through: :role_permissions
  attr_accessible :name, :permission_ids
end

http://railscasts.com/episodes/17-habtm-checkboxeshttp://railscasts.com/episodes/165-edit-multiple-revisedの組み合わせです

編集:

テーブルの見出しが逆になっていることに気付きました。これにより、ロールが上部に配置され、パーミッションが下部に配置されます。

# /app/views/roles/edit_multiple.html.erb

<%= form_tag update_multiple_roles_path, method: :put do %>
  <table>
    <tr>
      <th></th>
      <% @roles.each do |role| %>
        <th><%= role.name %></th>
      <% end %>
    </tr>
    <% @permissions.each do |permission| %>
      <tr>
        <th><%= permission.name %></th>
        <% @roles.each do |role| %>
          <td><%= check_box_tag "roles[#{role.id}][permission_ids][]", permission.id, role.permissions.include?(permission) %></td>
        <% end %>
      </tr>
    <% end %>
  </table>

  <%= submit_tag "Save" %>
<% end %>
于 2013-03-11T18:42:52.470 に答える
1

OPからのリクエストとして、これを回答として追加します。

habtm には、必要に応じて調整できるチェックボックス付きの railscast があります: railscasts.com/episodes/17-habtm-checkboxes

于 2013-03-12T09:51:36.710 に答える