【问题标题】:ActiveAdmin & Devise -- reset_password_token is not unique when updating Users?ActiveAdmin & Devise -- reset_password_token 在更新用户时不是唯一的?
【发布时间】:2013-12-24 11:10:42
【问题描述】:

所以我对Active 模型的后端运行授权进行了设计(您可以将 Actives 视为用户)。我还让 ActiveAdmin 与它一起运行。

这里是app/admin/active.rb

ActiveAdmin.register Active do

  # Specify which columns we want to appear in our ActiveAdmin index page
  index do
    column :name
    column :email
    column :class
    column :major

    # Adds view/edit/delete actions
    default_actions
  end

  controller do
    def permitted_params
      params.permit!
    end
  end
end

问题是:假设我用 100 个 Actives 填充我的数据库。然后我进入 ActiveAdmin 尝试编辑 Active,并且有一堆字段,包括名为 Reset password token 的内容。问题是,Reset password token(由 Devise)有一个唯一性约束,因为我需要在其字段中为我编辑的每个 Active 输入不同的内容。例如,如果我在编辑第一个 Active 时将其留空,则更新将通过。如果我在编辑第二个 Active 时将字段留空再次,我会收到以下错误:

SQLite3::ConstraintException: column reset_password_token is not unique: UPDATE "actives" SET "encrypted_password" = ?, "reset_password_token" = ?, "current_sign_in_ip" = ?, "last_sign_in_ip" = ?, "major" = ?, "class" = ?, "biography" = ?, "updated_at" = ? WHERE "actives"."id" = 95

我的问题:处理这个问题的最佳方法是什么?据我所知(不多),如果用户忘记了密码并且需要将其发送给他们,则使用Reset password token,那么如果管理员需要更新用户,他们应该在此字段中输入什么?在这种情况下最好的解决办法是什么?

谢谢。

【问题讨论】:

  • 为什么要更改重置密码令牌?如果可以的话,我建议甚至不要让管理员能够更改该字段,因为系统会处理它。不要从您的视图中发送重置密码令牌字段,以便管理员无法更改它。
  • 我该怎么做呢?我只是从视图中删除该字段吗?这不只是提交每个update 请求并带有空白Reset password token 吗?
  • 不,只删除表单字段栏不会更改该字段,它会保持原样。
  • 您是在使用 Devise 为管理员创建的文件来编辑活动,还是在视图中使用自己编写的代码?您可以添加您用于管理员编辑活动的视图吗?
  • 我正在使用 Devise 为管理员创建的文件来编辑活动;我如何访问它并从 ActiveAdmin 编辑视图中删除 Reset password token

标签: ruby-on-rails devise activeadmin


【解决方案1】:
rails generate devise:views

运行此命令,您将能够自定义设计视图。

您可以在此处阅读有关编辑设计视图的更多信息 https://github.com/plataformatec/devise#configuring-views

【讨论】:

  • 但这只会生成Devise 创建的视图,而不是管理界面中的视图,对吧?
  • 我想你在哪里使用 Devise 为你创建的文件来编辑活动,如果你生成视图,你可以查看它们并更改它们以满足你的需要。
  • 是的,我知道,并且我能够在我的 Devise 生成的编辑页面中成功编辑活动。但是,问题是当我尝试在 ActiveAdmin 门户中编辑 Active 时 - 然后出现 Reset password token 问题。
【解决方案2】:

将 NULL 写入 rerset_password 而不是空白。

如果您为第一个用户设置空白,则第二个空白将成为约束对象。

在唯一约束的情况下 NULL 允许重复并且不被认为是相同的值。但请注意,并非所有引擎都确认此标准。例如 MS SQL Server 没有,您需要在约束中添加条件,例如 where: '([reset_password_token] IS NOT NULL)'

【讨论】:

    【解决方案3】:

    很遗憾这里没有针对实际问题的正确答案。我遇到了完全相同的问题,来到这里无济于事。现在,在阅读了Active Admin 文档和formatastic 文档之后,我已经设法解决了这个问题。

    解决方案:

    问题是reset_password_token 自动添加到活动管理员表单中,默认为null。如果我们只是简单地完成这个,那么我们只需要提交一次,但之后就不行了,因为数据库需要唯一的条目并且只允许一个null。唯一可行的方法是每次提交表单时都手动提供唯一的reset_password_token,但这并不实际。

    不过,Active Admin 提供了一种控制表单字段的方法。您需要将其添加到上述文件中:

    ActiveAdmin.register Active do
    
      # Specify which columns we want to appear in our Active Admin form (new and edit):
      form title: 'Form for active ([...or any title you want...])' do |f|
        inputs 'Details' do
          input :name
          input :email
          input :class
          input :major
          # add any other fields you want to allow
          # but not adding other fields means no other field will come into the form
          # including reset_password_token. Hence, problem solved :-)
        end
        actions
      end
      
      # Rest of your code goes here...
    end
    

    有关可用输入选项和表单用法的更多信息,请参阅格式文档:https://github.com/formtastic/formtastic

    (检查使用部分的末尾和可用输入

    【讨论】:

    • @r123454321 请接受答案,因为它是正确的解决方案。我希望它可以帮助某人:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多