首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails 5:来自枚举的散列( collection_check_boxes )

Rails 5:来自枚举的散列( collection_check_boxes )
EN

Stack Overflow用户
提问于 2019-06-10 17:45:56
回答 4查看 1.1K关注 0票数 0

如何从哈希enum创建collection_check_boxes

代码语言:javascript
复制
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

我尝试了很多方法:

代码语言:javascript
复制
= form_for(@user) do |f|
  = f.collection_check_boxes :permissions, Role.permissions, :last, :first
  = f.submit class: "button"

我有undefined method permissions for #<User:0x00007...>

如果我尝试这样做:

代码语言:javascript
复制
= form_for(@user) do |f|
  = f.collection_check_boxes :roles, Role.permissions, :last, :first
  = f.submit class: "button"

用户控制器:

代码语言:javascript
复制
def update
  @user = User.new(user_params)
  if @user.save 
     ...
end

def user_params
  params.require(:user).permit(:roles)
end

我有Unpermitted parameter: :roles

尽管考虑了params:

代码语言:javascript
复制
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "user"=>{"roles"=>["", "1", "2"]}, "commit"=>"Update", "id"=>"3"}

还有这是勾选创建,如何取消勾选才能删除?

更新:尝试@Steve说我应该使用嵌套表单

代码语言:javascript
复制
= 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:

代码语言:javascript
复制
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "user"=>{"roles_attributes"=>{"0"=>{"permission"=>["", "read_message", "write_message"], "id"=>"18"}}}, "commit"=>"Update", "id"=>"3"}

我得到了Unpermitted parameter: :permission,尽管我在控制器中允许它:

代码语言:javascript
复制
def user_params
  params.require(:user).permit(roles_attributes: %i[id permission _destroy])
end

我认为参数应该是这样的:

代码语言:javascript
复制
params = { user: {
  roles_attributes: [
    { permission: 'read_message' },
    { permission: 'write_message' },
    ...
  ]
}}

相反,我现在在params中得到的是:

代码语言:javascript
复制
params = { user: {
  roles_attributes: [
    { permission: ['', 'read_message', 'write_message' }
    ...
  ]
}}
EN

回答 4

Stack Overflow用户

发布于 2019-06-10 19:23:40

对于强参数,当需要标量值数组时,需要告诉Rails;否则,它只需要一个值。

这里需要的语法是:

代码语言:javascript
复制
params.require(:user).permit(roles: [])

如果将来需要在roles数组中包含特定的键,还可以这样做:

代码语言:javascript
复制
params.require(:user).permit(roles: {:role_id, :name})

这将允许任意数量的角色,但每个角色只能具有键role_idname

希望这能有所帮助;最近我自己也在为此而苦苦挣扎。

票数 0
EN

Stack Overflow用户

发布于 2019-06-11 03:19:36

对于未定义的方法错误,请尝试将枚举解密放入方法中。

代码语言:javascript
复制
def permissions
    enum permission: {
       read_contact: 0,
       write_contact: 1,
       read_message: 2,
       write_message: 3
    }
end
票数 0
EN

Stack Overflow用户

发布于 2019-06-17 15:26:20

如果你想要嵌套的形式。你可以试试这个。

在HTML文件中

代码语言:javascript
复制
- Role.permissions.each do |key, value|
  = f.fields_for :roles, @user.roles.build do |fr|
    = fr.checkbox :permission, {}, value, false

在模型文件中: user.rb

代码语言:javascript
复制
accepts_nested_attributes_for :roles, reject_if:  proc { |attributes| attributes['permission'].blank? }

正确的参数roles_attributes"=>{"0"=>{"permission"=>"1"}, "3"=>{"permission"=>"2"}}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56523970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档