ActiveAdmin& Devise - reset_password_token在更新用户时不是唯一的吗?

时间:2013-12-24 11:10:42

标签: ruby-on-rails devise activeadmin

所以我设计了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,那么如果需要更新用户,管理员应该在该字段中添加什么? ?在这种情况下最好的解决办法是什么?

感谢。

3 个答案:

答案 0 :(得分:0)

rails generate devise:views

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

您可以在此处详细了解如何编辑设计视图 https://github.com/plataformatec/devise#configuring-views

答案 1 :(得分:0)

将NULL写入rerset_password而不是空白。

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

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

答案 2 :(得分:0)

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

解决方案:

问题在于,reset_password_token自动添加到Active Admin表单中,默认情况下为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

(检查用法部分和可用输入的结尾)