Rails 5:enum(hash)中的collection_check_boxes

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (10)

如何从hashed创建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

尽管看了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"

我从数据库获得了正确的检查权限!好极了!!

但是在发送表格时,这是参数:

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应该是这样的:

params = { user: {
  roles_attributes: [
    { permission: 'read_message' },
    { permission: 'write_message' },
    ...
  ]
}}

相反,我现在得到了params:

params = { user: {
  roles_attributes: [
    { permission: ['', 'read_message', 'write_message' }
    ...
  ]
}}
提问于
用户回答回答于

使用未定义的方法错误,尝试将enum decleration放在方法中。

def permissions
    enum permission: {
       read_contact: 0,
       write_contact: 1,
       read_message: 2,
       write_message: 3
    }
end
用户回答回答于

使用强参数时,您需要在期望一组标量值时告诉Rails; 否则,它只需要一个值。

您需要的语法是:

params.require(:user).permit(roles: [])

如果roles将来需要在阵列中使用特定键,您还可以:

params.require(:user).permit(roles: {:role_id, :name})

这将允许任意数量的角色,但每个角色只允许拥有密钥role_idname

希望这可以帮助; 我最近自己也在挣扎。

扫码关注云+社区

领取腾讯云代金券