2

好吧,我有以下設置並需要一些指導。我已經浪費了在這個問題上幾乎2天,我需要繼續前進:如何使用has_many創建複選框網格:通過關聯

所以,角色和權限通過RolePermissions相關 角色 - > RolePermission - >權限

我希望創造一個複選框網格允許我同時編輯所有角色和權限。

這就是即時尋找視覺:Roles/Permissions checkbox grid

任何幫助將不勝感激!另外,我正在使用simple_form和bootstrap。

+0

沒有與複選框的habtm一個railscast您可以修改它以適應您的需求: http://railscasts.com/episodes/17-habtm-checkboxes – DickieBoy 2013-03-11 18:01:54

+0

能否請您把這個評論到一個答案,因爲使用該railscast我能夠創建一些東西和id喜歡給你poi的功勞在正確的方向nting我:) – 2013-03-11 18:21:29

回答

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 %> 
+0

我想出了另一種解決方案,但這是更好/優雅 – 2013-03-11 18:54:02

+0

是的,我已經注意到實施標題時,自己改變它....我的解決方案是非常類似於這個和這極大地幫助了我。謝謝! – 2013-03-11 19:03:15

+0

我碰到一個輕微的問題。當所有複選框未被選中時,表單將沿帖子發送任何東西。這意味着沒有params [:roles]存在,因此我得到「未定義方法has_key?」爲nil:NilClass「,因爲params [:rails]不存在。我已經檢查了params [:rails]是否存在,並試圖手動構建它,但我非常喜歡軌道,我失敗了。有什麼建議麼? – 2013-03-11 20:35:44

1

爲答案添加爲從OP要求:

有上覆選框的habtm一個railscast您可以適應它您的需求:railscasts.com/episodes/17-habtm-checkboxes

+0

這個railscast絕對給了我正確的方向邁出的第一步......在山姆的迴應之前肯定會被標記爲答案。還是一個非常好的鏈接,看看你是否在我的情況! – 2013-03-12 13:54:57

相關問題