ruby-on-rails - 如何使用 has_many 创建复选框网格 :through association

标签 ruby-on-rails ruby-on-rails-3 simple-form has-many-through twitter-bootstrap-rails

好的,我有以下设置并需要一些指导。我在这个问题上浪费了将近 2 天的时间,我需要继续:

因此角色和权限是通过RolePermissions关联的 角色 -> 角色权限 -> 权限

我希望创建一个复选框网格,允许我同时编辑所有角色和权限。

这就是我在视觉上寻找的东西:Roles / Permissions checkbox grid

任何帮助将不胜感激!另外,我正在使用 simple_form 和 bootstrap。

最佳答案

试试这个,

# /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-checkboxes 的组合和 http://railscasts.com/episodes/165-edit-multiple-revised

编辑:

刚刚注意到我的 table 倒着了。这会将角色放在顶部,将权限放在侧面,

# /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 %>

关于ruby-on-rails - 如何使用 has_many 创建复选框网格 :through association,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15345310/

相关文章:

ruby-on-rails - ClientSideValidations 未显示在 Twitter Bootstrap-Modal Rails 3.2 中

ruby-on-rails - Rails 无法识别真假

ruby-on-rails - 在命名空间内设计路由助手 - 与warden.authenticate 的问题!

jquery - 我使用 CoffeeScript 的 ajax 帖子未处理成功回调

ruby-on-rails-3 - Ruby on Rails : Session with ActiveResource?

ruby - 使用 SimpleForm 上传 CarrierWave;为什么 "remote_image_url"和 "image"保存到同一数据库列?

css - 如何自定义使用 simple_form gem 创建的设计登录和注册表单?

ruby-on-rails - 在 ruby​​ 中存储可解密密码的安全方法

ruby-on-rails - 如何在Rails中过滤与分组选择的关联

ruby-on-rails - 来自 Model 的动态样式大小的回形针附件