【问题标题】:Rails User Model not being assigned an ID when using User.create()使用 User.create() 时未为 Rails 用户模型分配 ID
【发布时间】:2017-09-12 12:38:33
【问题描述】:

我试图寻找答案,但他们都在使用 User.new 等而不是创建。

当在控制台中使用具有有效属性的 User.create() 时,我得到一个用户,其 ID 为 nil,时间戳为 nil。

这是我的用户模型。

 class User < ApplicationRecord
  attr_writer :name, :email
  before_save {self.email = email.downcase}

  validates :username, presence:true,
                       length: {maximum: 30},
                       uniqueness:true


  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence:true,
                    length: {maximum:200},
                    format: {with: VALID_EMAIL_REGEX},
                    uniqueness: {case_sensitive: false}

  has_secure_password

  validates :password, presence: true,
                       length: {minimum:6}

end

在我正在使用的 rails 控制台中

User.create(username:"oiuedhioj", email:"damhan@dagr.com",password:"test",password_confirmation:"test")

然后回来

<User id: nil, username: "Damhan", email: nil, created_at: nil, updated_at: nil, password_digest: "$2a$10$oGtRgcHigaHh/UCVX4QdM.AOgyGur8Oud5MyKZheUcQ..."> 

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    尝试在 Rails 控制台中进行创建。

    返回没有 Id 或时间戳的记录是无效记录的标志。

    user = User.create(...)
    user.valid?
    => false
    user.errors.any?
    => true
    

    【讨论】:

      【解决方案2】:

      除了您已经获得的提示之外,使用create!save! 等代替它们的补码来获得错误异常,从而快速失败并因此更容易调试代码。如果您有充分的理由,请仅使用不带 ! 的变体。由于无论如何您都必须手动检查错误,因此拥有适当的异常通常会更干净。

      【讨论】:

      • 不,不要在生产代码中使用!。除非你准备好捕捉异常。 AR 被设计为因验证而失败,而不会引发异常。这样您就可以完成请求,并在出现错误字段时简单地使用带有错误字段的表单进行响应。
      • 是的,绝对在生产中使用!。验证工作得很好。显然,您确实捕获了您期望发生的异常并知道如何处理它!手动检查错误只是对最难的错误类型的公开邀请。谷歌“快速失败”看看我的意思。 @fbelanger
      • 不,不要在 AR 的生产环境中使用 bang。当然在其他地方使用引发异常,但是为每个可能的验证引发异常是错误的。原因是这会强制手动检查(捕获)。在将有错误的对象发送回表单时,将突出显示字段。 stackoverflow.com/questions/1761076/…
      • @fbelanger,我们像这样来回讨论这个问题是零意义的。我给出的论点超出了验证范围,不会继续。没关系。
      • 这毫无意义,因为你所做的只是在没有真正讨论任何假设你的正义的情况下吐出你的论点。至少我用你的提议争论过。我非常了解什么快速失败我不需要谷歌,而且不适用于这里。肯定是从数据库层快速失败,快速失败的 AR 记录你没有阅读 Rails 的基本错误处理吗?在你发现你的异常之后,你会做 Rails 会做的事情,或者是最糟糕且无法维护的事情。
      【解决方案3】:

      您仅将 nameemail 设置为可写。在该列表中包括 id 和其他属性。或者,如果您的 rails 版本是 4+,请在控制器中使用 strong parameters

      #user_controller.rb
      
      ...
      private
      
      def user_params
        params.require(:user).permit(:id, :name, :email ... )
      end
      ...
      

      【讨论】:

      • Rails 默认将所有列添加为可访问。你的想法是来自 Rails 3 的 attr_accessible。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多