2016-04-18 5 views
0

ich ein Problem über simple_token_authentication bin Debuggen, modifizierte ich einige Code in https://github.com/gonzalo-bulnes/simple_token_authentication/blob/master/lib/simple_token_authentication/sign_in_handler.rb#L7 zu:Welchen möglichen Grund, warum Rettung in Ruby nicht funktioniert?

def sign_in(controller, record, *args) 
    begin 
    puts "=== TRACE 1" 
    integrate_with_devise_trackable!(controller) 
    puts "=== TRACE 2" 
    controller.send(:sign_in, record, *args) 
    puts "=== TRACE 3" 
    rescue Exception => e 
    puts "=== TRACE 4" 
    ensure 
    puts "=== TRACE 5" 
    end 
end 

Ausgänge:

Started GET "/projects" for ::1 at 2016-04-18 18:35:22 +0800 
    ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations".* FROM "schema_migrations" 
Processing by ProjectsController#index as JSON 
    Parameters: {"project"=>{}} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."email" = ? ORDER BY "users"."id" ASC LIMIT 1 [["email", "[email protected]"]] 
=== TRACE 1 
=== TRACE 2 
    (0.1ms) begin transaction 
    (0.0ms) commit transaction 
=== TRACE 5 
Completed 401 Unauthorized in 40ms (ActiveRecord: 0.9ms) 

Die Frage ist nicht über simple_token_authentication, die Frage ist, warum TRACE 3 und TRACE 4 beide nicht ausgegeben? Gibt es einen möglichen Grund könnte dies verursachen?

Meine Umgebung:

  • rubin 2.2.3 [x86_64] installiert von rvm
  • Mac OSX 10.11.4
+0

Das ist interessant. Wenn du nur ein reproduzierbares Snippet geschrieben hast ... :) –

+0

Ich versuche ein kleines Projekt zu erstellen, um es zu reproduzieren. –

+0

Kann nicht reproduzieren, ich lösche nur db/development.sqlite3 und rake db: migrate, es gibt TRACE 1, 2, 3 und 5 aus, es ist richtig. Ich weiß nicht warum. –

Antwort

5

Devise und warden verwenden throw/catch dass warden nicht in der Lage war zu kommunizieren Melden Sie den Benutzer an. Solange sich ein passender Block catch oben auf dem Stapel befindet, löst throw keine Ausnahme aus, sodass die Rescue-Klausel nicht aufgerufen wird. Stellen Sie sicher, dass es aufgerufen wird, weil es immer aufgerufen werden soll. Sie können dies testen mit diesem kleinen Schnipsel:

def test 
    puts "about to throw" 
    throw :rock, :hard 
rescue Exception => e 
    puts "exception: #{e.message}" 
ensure 
    puts "ensure" 
end 

result = catch(:rock) { test } 
puts result 

die rescue Klausel ausführen nicht immer, aber wenn man nur test auf eigene rufen dann werden Sie eine UncaughtThrowException durch den Block behandelt bekommen.

In diesem Fall stellt Devise eine Rack-Middleware zur Verfügung, die das fängt, was Warden wirft.

+0

Großartig! vielen Dank. –

Verwandte Themen