Как создать collection_check_boxes из хэша enum
:
class User < ApplicationRecord
has_many :roles, dependent: :destroy
accepts_nested_attributes_for :roles, allow_destroy: true
end
class Role < ApplicationRecord
belongs_to :user
enum permission: {
read_contact: 0,
write_contact: 1,
read_message: 2,
write_message: 3
}
end
Я пробовал разными способами:
= form_for(@user) do |f|
= f.collection_check_boxes :permissions, Role.permissions, :last, :first
= f.submit class: "button"
Я получил undefined method permissions for #<User:0x00007...>
Если я попробую с:
= form_for(@user) do |f|
= f.collection_check_boxes :roles, Role.permissions, :last, :first
= f.submit class: "button"
Пользовательский контроллер:
def update
@user = User.new(user_params)
if @user.save
...
end
def user_params
params.require(:user).permit(:roles)
end
Я получил Unpermitted parameter: :roles
Несмотря на просмотр параметров:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "user"=>{"roles"=>["", "1", "2"]}, "commit"=>"Update", "id"=>"3"}
Также это проверка для создания, как снять флажок для удаления?
Обновление: Попробуйте, как @Steve сказал, что я должен использовать вложенную форму
= form_for(@user) do |f|
= f.fields_for :roles do |ff|
= ff.collection_check_boxes :permission, Role.permissions, :first, :first
= f.submit class: "button"
Я получил правильное проверенное разрешение из базы данных! Yay !!
Однако при отправке формы это параметры:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "user"=>{"roles_attributes"=>{"0"=>{"permission"=>["", "read_message", "write_message"], "id"=>"18"}}}, "commit"=>"Update", "id"=>"3"}
Я получил Unpermitted parameter: :permission
, хотя у меня есть разрешение в контроллере:
def user_params
params.require(:user).permit(roles_attributes: %i[id permission _destroy])
end
Я думаю, что параметры должны быть такими:
params = { user: {
roles_attributes: [
{ permission: 'read_message' },
{ permission: 'write_message' },
...
]
}}
Вместо этого, то, что я теперь получил в параметрах:
params = { user: {
roles_attributes: [
{ permission: ['', 'read_message', 'write_message' }
...
]
}}