2016-11-18 4 views
1

В моем приложении Rails у меня есть пользователи, роли и разрешения.Удалить из таблицы, если флажок не установлен

При создании/редактировании роли вы можете выбрать, какие разрешения разрешены, установив флажок, который сохранит разрешение в таблице с именем «role_permissions» (в основном разрешенные разрешения сохраняются в таблице соединений).

Так что мой изменить способ роль заключается в следующем:

def edit 
    @role = Role.find(params[:id]) 
    @permissions_by_controller = Permission.order('controller asc').group_by(&:controller) 
end 

и метод обновления (патч):

def update 
    @role = Role.find(params[:id]) 
    if @role.update_attributes(role_params) 
    redirect_to roles_path, :notice => 'Article updated!' 
    else 
    render 'edit' 
    end 
end 

и Params:

def role_params 
    params.require(:role).permit(:name, permission_ids: []) 
end 

В редактированием У меня есть флажок:

<%= check_box_tag "role[permission_ids][]", permission.id, @role.permissions.include?(permission), :id => permission.id, :class => 'switch__checkbox' %> 

Это отлично работает, когда я устанавливаю флажок и сохраняет его.

Однако, когда я снимаю флажок и сохраняю, он не удаляет разрешения ... предположительно, потому что никакого парама не передается обратно. Как я могу это решить?

Ассоциация устанавливается как:

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users, :join_table => 'users_roles' 
    has_and_belongs_to_many :permissions, :join_table => 'roles_permissions' 
end 

class Permission < ActiveRecord::Base 
    has_and_belongs_to_many :roles, :join_table => 'roles_permissions' 
end 

Примечания: Я также заметил, что Роли не могут быть удалены из пользователя таким же образом, как он использует флажки.

ответ

2

Классическая проблема. f.check_box решает это для вас, возвращая false, когда снят флажок, но нет.

Вы можете решить его с помощью скрытого поля с пустым значением непосредственно перед тегом.

<%= hidden_field_tag "role[permission_ids][]", '' %> 
<%= check_box_tag "role[permission_ids][]", permission.id... 

Форма знает, что заполняет пустое поле значения, когда ничего не выбрано. (Если это более понятно вам, вы можете также положить 'false' вместо пустой строки.)

Смежные вопросы