【问题标题】:How to edit user id in rails application如何在 Rails 应用程序中编辑用户 ID
【发布时间】:2018-03-03 11:06:47
【问题描述】:

现在对于我的 rails 应用程序(使用设计和活动管理员),我将用户 ID 作为序列号,具体取决于用户 ID 创建的序列,即我第一次获得用户 ID 1,然后再次使用不同的详细信息进行注册然后得到用户 id 2,然后是 3,依此类推。 但我想要自定义用户 ID,例如 greg51 或 michel7as 或在用户注册页面中询问的类似内容 我该怎么做?

【问题讨论】:

  • 这些字段应该是用户名而不是 ids
  • 此更改的目的是什么?因为数据库中的 id 必须是唯一的,像 greg51 这样的字符串不是一个好主意,最好使用 uuid。或者,如果您的目的是更改没有 ID 的友好网址,您可以使用此 gem:github.com/norman/friendly_id

标签: ruby-on-rails ruby devise ruby-on-rails-5 activeadmin


【解决方案1】:

如果您想使用用户名或电子邮件登录,只需按照以下中的设计说明进行操作:https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address

如果您想使用其他字段查找用户,您可以@user.find_by(username: params[:username]) 或您想要在控制器中使用的任何字段。

但是,您不应为新字段(用户名、电子邮件或其他)更改 id。 Rails 在它创建的所有表中生成一个id,并使用id 作为主键。永远不要更改主键,因为它将在其他表中用作参考。为此,它使用数据库中的一个序列字段,该字段创建唯一的整数值(它递增最后一个序列值并将其作为新的id 返回)并保证多个事务不能获得相同的值(因此没有其他记录将具有相同的id)。

除了主键之外,您还可以定义许多其他唯一字段,例如usernameemaildocument_id等。虽然这些字段也可以是唯一的(并且可以使用数据库约束和 rails 中的 validates uniqueness 强制唯一,它们不用作主键(因此您可以稍后更改它们并且不会影响引用)。

【讨论】:

    【解决方案2】:

    您想要的是所谓的虚 URL,您可以让用户提供更人性化的标识符以在 URL 中使用。使用的列通常称为 slug 列。

    这不是主键 ID 的替代品,无论是自动递增整数列的形式,还是基本相同的 UUID,但它使用随机生成的字符串来解决与可伸缩性相关的问题。主键是您的数据库表相互引用的方式。用用户生成的值替换它是可能的,但根本不是一个好主意。

    要在 Devise 中添加“用户名”功能,您需要:

    • 在迁移中添加用户名列。确保它具有唯一的约束。
    • 验证并确保用户名是 URL 安全且唯一的。
    • 改变 Warden 从数据库中查找用户的方式以使用 idusername 列。
    • 更改设计在其控制器中查找用户的方式以使用idusername 列。

    见:

    【讨论】:

      【解决方案3】:

      向您的用户模型添加一个字段:

      rails g migraton AddUsernamaToUser username:string 
      

      然后在您的设计表单中添加一个字段:

      https://github.com/plataformatec/devise/issues/4201
      

      您将能够要求提供用户名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 1970-01-01
        相关资源
        最近更新 更多