2011-07-18 6 views
0

私は、次のしている:これは、ロールバックを引き起こしているRailsの、汚れた物体が原因ロールバック

class User < ActiveRecord::Base 

    before_update :guest_upgrade 

    def guest_upgrade 
    # If the user changed their email that means they were a guest, and are no longer. 
    # Likely triggered from the Registrations#Update controller 
    if self.email_changed? 
     self.guest = false 
    end 
    end 

、ここでは上記のログ劇中である:

Started POST "/users" for 127.0.0.1 at 2011-07-18 14:54:00 -0700 
    Processing by RegistrationsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"x+u1DSDanU2QXK/q0=", "user"=>{"fname"=>"xxxxx", "lname"=>"xxxx", "email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"1"}, "commit"=>"Create my account", "fb_access_token"=>"", "fb_uuid"=>""} 
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 5 LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 5 LIMIT 1 
    SQL (0.1ms) BEGIN 
    User Load (0.5ms) SELECT "users"."id" FROM "users" WHERE ("users"."email" = '[email protected]') AND ("users".id <> 5) LIMIT 1 
    SQL (0.2ms) ROLLBACK 
    Authentication Load (0.5ms) SELECT "authentications".* FROM "authentications" WHERE "authentications"."provider" = 'facebook' AND ("authentications".user_id = 5) LIMIT 1 
Rendered layouts/_header.html.erb (3.9ms) 
    CACHE (0.0ms) SELECT "authentications".* FROM "authentications" WHERE "authentications"."provider" = 'facebook' AND ("authentications".user_id = 5) LIMIT 1 
Rendered registrations/edit.html.erb within layouts/application (107.0ms) 
Completed 200 OK in 484ms (Views: 111.7ms | ActiveRecord: 6.0ms) 

しかし、私はguest_upgradeをコメントアウトした場合それはうまく動作します:

Started POST "/users" for 127.0.0.1 at 2011-07-18 14:55:23 -0700 
    Processing by RegistrationsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"xxxxx+u1DSDanU2QXK/q0=", "user"=>{"fname"=>"XXXX", "lname"=>"XXXX", "email"=>"[email protected]"}, "commit"=>"Save Changes"} 
    User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 5 LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 5 LIMIT 1 
    SQL (0.1ms) BEGIN 
    User Load (0.4ms) SELECT "users"."id" FROM "users" WHERE ("users"."email" = '[email protected]') AND ("users".id <> 5) LIMIT 1 
    AREL (0.7ms) UPDATE "users" SET "fname" = 'XXXX', "lname" = 'XXXX', "email" = '[email protected]', "updated_at" = '2011-07-18 21:55:23.817142' WHERE "users"."id" = 5 
[paperclip] Saving attachments. 
    SQL (37.9ms) COMMIT 
Redirected to http://localhost:3000/ 
Completed 302 Found in 780ms 

汚れたオブジェクトを間違って使用していますか?

私がやりたいすべてのユーザーが、更新されたユーザが電子メールを変更した場合、falseにuser.guestフィールドを変更したとき、あります。

提案?ありがとう

+1

'guest'をfalseに設定すると、検証に失敗していますか? –

+0

これはfnameとlnameが必要なので、アップデートで設定されています – AnApprentice

+1

問題はここにあると思います... WHERE( "users"。 "email" = '[email protected]')AND( "users" .id <> 5)何らかの理由でLIMIT 1がDBに存在しないEMAILアドレスを参照しています...何も見つかりません – AnApprentice

答えて

0

私は以前この問題があったと思います。私は起こっていることが間違っていることを信じています。そのような明示的なリターンを追加してみてください:

if self.email_changed? 
    self.guest = false 
    return true 
end 

セクションをご覧くださいruby on rails.org apiでキャンセルコールバックをマーク。

キャンセルコールバック

before_が*コールバックがfalseを返した場合

、以降のすべてのコールバックと 関連するアクションはキャンセルされます:それは読み込みます。 after_ *コールバックがfalseを返すと、 すべての後のコールバックがキャンセルされます。コールバックは通常、 で定義されたコールバックを除いて、 で実行されます。コールバックは、最後に呼び出される メソッドとして定義されています。

は、私が遅刻を知っているが、私はこのことができます願っています!

関連する問題