2012-10-10 147 views
0

我正在使用Rails 3.2.8和Devise 2.1.2(最新),併爲我爲什麼可以創建一個用戶很好用Ruby 1.9 .2但不能與Ruby 1.9.3,使用完全相同的代碼庫。創建新用戶使用紅寶石1.9.2但失敗與紅寶石1.9.3

Rails的控制檯:

User.find_or_create_by_email('[email protected]', :password => 'example', :first_name => 'Super', :last_name => 'Admin', :terms_and_conditions => true) 

的輸出1.9.3顯示ROLLBACK(見下文),但我似乎無法找出原因。使用1.9.3時

SQL (0.3ms) INSERT INTO "versions" ("created_at", "event", "item_id", "item_type", "object", "whodunnit") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["created_at", Wed, 10 Oct 2012 13:57:07 UTC +00:00], ["event", "create"], ["item_id", 20], ["item_type", "OrderType"], ["object", nil], ["whodunnit", nil]] 
    Currency Load (1.1ms) SELECT "currencies".* FROM "currencies" WHERE "currencies"."code" = 'USD' LIMIT 1 
SQL (2.4ms) INSERT INTO .. 
(continues with the next insert statement) 

輸出(部分):使用1.9.2當

輸出(部分)

SQL (0.3ms) INSERT INTO "versions" ("created_at", "event", "item_id", "item_type", "object", "whodunnit") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["created_at", Wed, 10 Oct 2012 12:29:49 UTC +00:00], ["event", "create"], ["item_id", 16], ["item_type", "OrderType"], ["object", nil], ["whodunnit", nil]] 
    Currency Load (0.3ms) SELECT "currencies".* FROM "currencies" WHERE "currencies"."code" = 'USD' LIMIT 1 
(0.1ms) ROLLBACK 
=> #<User id: 4, first_name: "Super", last_name: "Admin", admin_notes: nil, email: "[email protected]", ... 
(stops) 

我想這可能是與設計的問題,但我不確定。

將不勝感激任何幫助!


更新10月19日:

我發現這個問題的原因是after_create回調user.rb是(通過經紀人模式)創建了一個「經紀人」的地方設置佣金= 9.95

從broker.rb註釋:

# commission :decimal(,) 

多由broker.rb:

belongs_to :user 
PRICE_REGEX = /^([1-9]\d{0,20}|0)(\.\d{0,3})?$/ 
PRICE_ERROR_MESSAGE = "Must be a number. If you want to include decimals, please use comma as decimal separator. Periods (.) = thousand separator cannot be used." 
validates :commission, :format => {:with => PRICE_REGEX, :message => PRICE_ERROR_MESSAGE }, :allow_blank => true 

如上所述,將代理佣金設置爲9.95可以在Ruby 1.9.2中正常工作,但是無法使用紅寶石1.9.3。

在1.9.3中通過rails控制檯保存時,出現「ActiveRecord :: RecordInvalid:Validation failed ...」錯誤。 1.9.2沒有錯誤。

如果我將它設置爲10而不是9.95,它同時適用於1.9.2和1.9.3(代理佣金設置爲10)。

如果我將其設置爲9,95(逗號,而不是句點)的用戶和經紀人建立罰款,但券商佣金設定爲0

作爲驗證錯誤消息指出,句號(。)是不允許,所以驗證失敗是有道理的,但是在1.9.2之前,它已經有了一個bug,在我切換到1.9.3之前它已經工作了。

歡迎任何好的解釋:-)

+0

你確定這是不是一個驗證問題? INSERT看起來幾乎相同。 – tadman

+0

@tadman謝謝 - 但代碼運行在相同的代碼庫上,那麼它怎麼會是一個驗證問題? – rassom

+1

這可能是你的'before_save'類型例程中的一個無意中返回'false'並暫停保存操作,或者像是失敗的唯一性檢查。確保你使用'save!'或'create!'來正確觸發異常。 – tadman

回答

0

保存失敗後,請檢查@user。錯誤它可能有一個線索

編輯

在Rails控制檯

@user = User.find_or_create_by_email('[email protected]', :password => 'example', :first_name => 'Super', :last_name => 'Admin', :terms_and_conditions => true) 
@user.errors 

@user.errors.full_messages 
+0

它可以在不與模型混淆的情況下完成嗎?如果是的話,我怎麼能在控制檯上做到這一點? (新手Rails,所以希望你能和我一起袒護) – rassom

+0

'createuser.errors.full_messages'給你很好的,可讀的輸出,如果有任何錯誤。 – tadman

+0

我編輯了我的原始答案,請再次檢查 – graudeejs