【问题标题】:Using ActiveAdmin to edit/create Users -- ForbiddenAttributesError使用 ActiveAdmin 编辑/创建用户 -- ForbiddenAttributesError
【发布时间】:2013-12-23 08:11:31
【问题描述】:

所以我在这里完成了 Rails 教程:

http://ruby.railstutorial.org/ruby-on-rails-tutorial-book

并试图让 ActiveAdmin 能够删除用户。通过教程,我的用户模型 has_secure_password 并且还有一个 remember_token 属性。因此,当我进入我的 ActiveAdmin 用户页面并尝试编辑用户时,要填写的字段是:用户名、电子邮件、密码摘要、记住令牌。

例如,当我修改名称字段并尝试提交编辑请求时,我得到一个ActiveModel::ForbiddenAttributesError。当我尝试创建用户时也会发生这种情况。我认为这显然与我的身份验证/密码设置有关,但是对于 Rails 来说还很新,我不确定从哪里开始寻找。有什么想法吗?

编辑:我尝试将此添加到我的 app/admin/user.rb 文件中:

controller do
  def resource_params
    return [] if request.get?
    [ params.require(:active).permit(:name, :email, :password_digest, :remember_token) ]
  end
end

我的堆栈跟踪中的这个错误消失了:

Unpermitted parameters: utf8, _method, authenticity_token, commit, id

现在,当我在 ActiveAdmin 中点击 update 时,我不再收到 ForbiddenAttributesError。相反,页面重新加载,但未提交更改,我在终端中收到此消息:

 Started PATCH "/admin/users/59" for ...
 ...
 ...
 (0.1ms)  begin transaction
 User Exists (0.5ms)  SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('example-58@railstutorial.org') AND "users"."id" != 59) LIMIT 1
 (0.2ms)  rollback transaction

这是我的 users_controller.rb:

def update
  @active = Active.find(params[:id])
  if @active.update_attributes(active_params)
    flash[:success] = "Profile updated"
    redirect_to @active
  else
    render 'edit'
  end
end

private

  def active_params
    return [] if request.get?
    [ params.require(:active).permit(:name, :email, :password_digest, :remember_token) ]
  end

【问题讨论】:

    标签: ruby-on-rails activeadmin


    【解决方案1】:

    我不具体了解 ActiveAdmin,但您的错误表明您不允许您的 id 参数


    参数

    你的参数是这样的:

    params.permit user: [:name, :email, :password_digest, :remember_token ]
    

    我先试试这个:

    params.require(:user).permit(:name, :email, :password_digest, :remember_token)
    

    ActiveAdmin

    How to get ActiveAdmin to work with Strong Parameters?

    根据这个问题,你需要查看official documentation,也许可以试试这个:

       config.before_filter do
           params.permit!
       end
    

    【讨论】:

    • 如果您不想像这样设置整个管理界面,您可以通过删除“配置”仅在一个界面中进行。
    【解决方案2】:

    这是 Active Admin 的现有问题:https://github.com/gregbell/active_admin/issues/2595

    这是设置的症状:

    config.action_controller.action_on_unpermitted_parameters = :raise
    

    我还不知道有什么解决方案,正如你所见,没有人评论过这张票。最方便的选择不是对未经允许的参数使用:raise,而是使用跳过它们的默认行为。

    【讨论】:

    • 所以我已经尝试了 deneuxa 在这里说明的修复:github.com/gregbell/active_admin/issues/2595 但我收到错误消息User Exists (0.5ms) SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('example-59@railstutorial.org') AND "users"."id" != 60) LIMIT 1 用户的电子邮件和 id 属性显然是唯一的,但为什么会出现此错误在补丁上提出?
    • 你们会建议我从从头实现身份验证切换到使用 Devise 吗?
    • 如果没有更多详细信息,我无法诊断您的问题。但总的来说,我很困惑:id 参数位于顶层;它应该嵌套在:user
    • 另请注意,有一个方便的 DSL 用于设置允许的参数:github.com/gregbell/active_admin/blob/…
    • 刚刚对 OP 进行了一些编辑——我不再收到 ForbiddenAttributesError;相反,事务被回滚。您可能需要任何具体的进一步信息来诊断此问题吗?非常感谢。
    【解决方案3】:

    ActiveAdmin 示例的 User.rb

    在这种情况下,用户 has_one :account

    ActiveAdmin.register User do
      config.batch_actions = false
    
      # Your params here
      permit_params :first_name, :last_name, :email,
       :born_date, :password, :password_confirmation, :account,
       account_attributes: [:country_id,:university_id, :english_level]
    
      # stuff
    
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      相关资源
      最近更新 更多