0

Rails 3.2.8 と Devise 2.1.2 (最新) を使用していますが、まったく同じコードベースを使用して、Ruby 1.9.2 では問題なくユーザーを作成できるのに、Ruby 1.9.3 では作成できない理由について困惑しています。

Rails コンソール:

User.find_or_create_by_email('example@example.com', :password => 'example', :first_name => 'Super', :last_name => 'Admin', :terms_and_conditions => true)

1.9.3 の出力は ROLLBACK (以下を参照) を示していますが、その理由がわかりません。

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 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.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 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: "example@example.com", ... 
(stops)

これはDeviseの問題である可能性があると考えていますが、よくわかりません.

助けていただければ幸いです!


10 月 19 日更新:

問題の原因は、after_create手数料 = 9.95 を設定する「ブローカー」を (ブローカー モデルを介して) 作成する user.rb のコールバックであることがわかりました。

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 では問題なく動作しますが、ruby 1.9.3 では失敗します。

1.9.3 で Rails コンソールから保存すると、「ActiveRecord::RecordInvalid: Validation failed...」というエラーが表示されます。1.9.2 ではエラーはありません。

9.95 ではなく 10 に設定すると、1.9.2 と 1.9.3 の両方で機能します (ブローカー手数料は 10 に設定されます)。

9,95 (ピリオドではなくコンマ) に設定すると、ユーザーとブローカーは正常に作成されますが、ブローカーの手数料は 0 に設定されます。

検証エラー メッセージが示すように、ピリオド (.) は許可されていないため、検証が失敗するのは理にかなっていますが、1.9.3 に切り替える前に動作していた ruby​​ 1.9.2 のバグだったでしょう。

どんな良い説明でも大歓迎です:-)

4

1 に答える 1

0

@user.errors の保存チェックに失敗した後、手掛かりがある可能性があります

編集

Rails コンソールで

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

また

@user.errors.full_messages
于 2012-10-10T15:49:40.207 に答える