簡體   English   中英

回滾事務錯誤-Rails

[英]Rollback Transaction Error - Rails

一些同學和我在上課的Rails應用程序中遇到了一些麻煩。 每當我們嘗試在rails控制台上為RoR應用程序使用User.create時,在完成必要的表單后,我們都會得到回滾事務。

有任何解決這個問題的方法嗎? 這是錯誤:

rails console
Loading development environment (Rails 3.2.13)
irb(main):001:0> User.count
   (0.0ms)  SELECT COUNT(*) FROM "users"
=> 0
irb(main):002:0> User.create(name: "Mr Rush", email: "rush@example.com", password: "fubar", password_confirmation: "fubar")
   (0.0ms)  begin transaction
  User Exists (0.0ms)  SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('rush@example.com') LIMIT 1
   (0.0ms)  rollback transaction
=> #<User id: nil, name: "Mr Rush", email: "rush@example.com", created_at: nil, updated_at: nil, password_digest: "$2a$10$quwMA.4fcrBpg2sRy00qEOWrjHduAN0OZFvcXiCmNjUR...">
irb(main):003:0>

User.rb文件

class User < ActiveRecord::Base
  attr_accessible :email, :name, :password, :password_confirmation
  has_secure_password

  before_save { |user| user.email = user.email.downcase }

  validates :name, presence: true, length: {maximum: 30}
  VALID_EMAIL_REGEX = /\A[\w+\-\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: {with: VALID_EMAIL_REGEX}, uniqueness: { case_sensitive: false }
  validates :password, presence: true, length: { minimum: 5 }
  validates :password_confirmation, presence: true
end

您的用戶無法創建,因為電子郵件未通過格式驗證。

有趣的是,它會報告此錯誤,就像唯一性是導致問題的原因一樣。 您已將用戶表顯示為空,因此它無法通過唯一性約束。

要嘗試的幾件事:

1)在控制台中嘗試以下操作:

user = User.new(name: "Mr Rush", email: "rush@example.com", password: "fubar", password_confirmation: "fubar")
user.valid?     <--- should give you false
user.errors     <--- should tell you the format of the email is incorrect

當我在驗證器中將presence與其他任何內容組合在一起時,在以下驗證中,我始終允許將該值留空; 如果必須但缺少某些內容,則沒有必要驗證其格式或唯一性。

validates :email, presence: true, format: {with: VALID_EMAIL_REGEX, allow_blank: true}, uniqueness: { case_sensitive: false, allow_blank: true }

這樣做可能會也可能不會改變它認為真正的驗證失敗的方式。

2)修復用於電子郵件驗證的正則表達式。 通過正則表達式驗證電子郵件地址有點爭議,但是您應該找到類似的方法:

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

您始終可以使用Rubular這樣的網站嘗試進行正則表達式驗證。

User.create(name: "Mr Rush", email: "rush@example.com", password: "fubar", password_confirmation: "fubar")

在執行Michael Hartls Rails Tutorial的過程中遇到此問題時,此示例將失敗,因為密碼fubar太短,設置為minimum: 6 清單6.39中的 minimum: 6 控制台確實比這里冗長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM