ActiveAdmin权限参数问题:更新用户时提示未授权:roles
ActiveAdmin用户更新时Unpermitted parameter: :roles问题解决
1. 修正permit_params配置
从日志可见,roles是顶级参数,并非嵌套在user下的roles_attributes,所以需要调整参数允许规则:
permit_params :email, :name, :organization_id, :partner_id, :social_listening_access, :invite_now, roles: [:global, :partner]
将原来的roles_attributes: [:global, :partner]替换为roles: [:global, :partner],这样就能授权顶级的roles参数。
2. 手动处理角色参数关联
由于roles不在user参数组内,ActiveAdmin默认不会自动将其传递给用户模型,需要在控制器中手动处理参数关联:
controller do def update # 提取顶级roles参数并从params中移除 roles_params = params.delete(:roles) super do |success, failure| success.html do # 根据你的模型关联逻辑处理角色更新,示例如下 if roles_params.present? # 假设User模型有处理角色的方法,比如update_roles resource.update_roles(roles_params) # 或者直接操作关联,比如: # resource.global_roles = roles_params[:global].reject(&:blank?) # resource.partner_roles = roles_params[:partner].reject(&:blank?) # resource.save end redirect_to admin_user_path(resource), notice: '用户更新成功' end end end end
注意:需要根据你实际的User与Role模型关联关系(如多对多、单关联等),调整角色更新的具体逻辑。
3. 可选:调整表单结构(若允许)
如果能修改ActiveAdmin的表单,将roles字段嵌套到user表单内,参数会自动归到user下,无需处理顶级参数:
form do |f| f.inputs '用户信息' do f.input :email f.input :name # 其他用户字段... # 嵌套角色字段 f.inputs '角色' do f.input :global, as: :check_boxes, collection: GlobalRole.all f.input :partner, as: :check_boxes, collection: PartnerRole.all end end f.actions end
此时permit_params可以改回使用roles_attributes: [:global, :partner](需确保模型设置了accepts_nested_attributes_for :roles)。
内容的提问来源于stack exchange,提问作者Rosario Alessandro Cali
相关产品推荐
相关产品推荐

