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 のバグだったでしょう。
どんな良い説明でも大歓迎です:-)