You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:05:42