如何从哈希enum
创建collection_check_boxes
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
尽管考虑了params:
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"
我从数据库中得到了一个正确的检查权限!耶!!
然而,在发送表单时,这是params:
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中得到的是:
params = { user: {
roles_attributes: [
{ permission: ['', 'read_message', 'write_message' }
...
]
}}
发布于 2019-06-10 19:23:40
对于强参数,当需要标量值数组时,需要告诉Rails;否则,它只需要一个值。
这里需要的语法是:
params.require(:user).permit(roles: [])
如果将来需要在roles
数组中包含特定的键,还可以这样做:
params.require(:user).permit(roles: {:role_id, :name})
这将允许任意数量的角色,但每个角色只能具有键role_id
和name
。
希望这能有所帮助;最近我自己也在为此而苦苦挣扎。
发布于 2019-06-11 03:19:36
对于未定义的方法错误,请尝试将枚举解密放入方法中。
def permissions
enum permission: {
read_contact: 0,
write_contact: 1,
read_message: 2,
write_message: 3
}
end
发布于 2019-06-17 15:26:20
如果你想要嵌套的形式。你可以试试这个。
在HTML文件中
- Role.permissions.each do |key, value|
= f.fields_for :roles, @user.roles.build do |fr|
= fr.checkbox :permission, {}, value, false
在模型文件中: user.rb
accepts_nested_attributes_for :roles, reject_if: proc { |attributes| attributes['permission'].blank? }
正确的参数roles_attributes"=>{"0"=>{"permission"=>"1"}, "3"=>{"permission"=>"2"}}
https://stackoverflow.com/questions/56523970
复制相似问题