2012-09-27 7 views
5

Ich bekomme immer noch die Fehlermeldung "Fehler" im Titel und weiß nicht, wie man es löst. Im Application,Rails 3 - Filterkette angehalten als: Authentifizierung gerendert oder umgeleitet

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :mailer_set_url_options 
    helper_method :current_user_session, :current_user 

    def mailer_set_url_options 
    ActionMailer::Base.default_url_options[:host] = request.host_with_port 
    end 

    private 
     def current_user_session 
     logger.debug "ApplicationController::current_user_session" 
     return @current_user_session if defined?(@current_user_session) 
     @current_user_session = UserSession.find 
     end 

     def current_user 
     logger.debug "ApplicationController::current_user" 
     return @current_user if defined?(@current_user) 
     @current_user = current_user_session && current_user_session.user 
     end 

     def authentication 
     logger.debug "ApplicationController::authentication" 
     unless current_user 
      store_location 
      flash[:warning] = "You must be logged out to access this page" 
      redirect_to root_url 
      return false 
     end 
     end 

     def store_location 
     session[:return_to] = request.url 
     end 
end 

im routes.rb

#match 'set_activity_account/:id/:value' => 'users#account_activity', :as => :set_activity_account -- this doesn't work as well.. 
    resources :users do 
    member do 
     get :action_a, :action_b 
    end 
    collection do 
     get 'account_activity' 
    end 
    end 

und der Userscontroller

class UsersController < ApplicationController 
    before_filter :authentication, only: [:index, :edit, :update, :destroy, :action_a, :action_b] 
    #skip_before_filter :authentication, :only => [:account_activity] didn't help as well 

    def account_activity 
    unless current_user.nil? 
     puts 'A' 
     if params[:user_id] && params[:status] 
     puts 'B' 
     User.find(params[:user_id]).update_attributes(:active => params[:status]) 
     flash[:notice] = 'Activity was successfully changed.' 
     end 
    end 
    redirect_to :back 
    end 
... 

Immer, wenn die aktiv aktualisiert Attribut, werde ich die Nachricht Weitergeleitet localhost erhalten: 3000/ Filterkette gestoppt: Authentifizierung

EDIT gemacht oder umgeleitet: Hinzugefügt Ausgabe von Log-Datei:

Started GET "https://stackoverflow.com/users/account_activity?user_id=31&status=0" for 127.0.0.1 at 2012-09-28 00:40:10 +0200 
Processing by UsersController#account_activity as HTML 
    Parameters: {"user_id"=>"31", "status"=>"0"} 
ApplicationController::current_user 
ApplicationController::current_user_session 
    User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."persistence_token" = '...' LIMIT 1 
    (0.1ms) BEGIN 
    (0.7ms) UPDATE "users" SET "last_request_at" = '2012-09-27 22:40:10.258152', "perishable_token" = '...', "updated_at" = '2012-09-27 22:40:10.259093' WHERE "users"."id" = 31 
    (0.7ms) COMMIT 
ApplicationController::current_user_session 
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", "31"]] 
    (0.1ms) BEGIN 
    User Exists (0.6ms) SELECT 1 FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 31) LIMIT 1 
    (0.5ms) UPDATE "users" SET "active" = 0, "perishable_token" = '...', "updated_at" = '2012-09-27 22:40:10.267227' WHERE "users"."id" = 31 
    (0.7ms) COMMIT 
Redirected to http://localhost:3000/users/31/edit 
Completed 302 Found in 19ms (ActiveRecord: 4.5ms) 


Started GET "https://stackoverflow.com/users/31/edit" for 127.0.0.1 at 2012-09-28 00:40:10 +0200 
Processing by UsersController#edit as HTML 
    Parameters: {"id"=>"31"} 
ApplicationController::authentication 
ApplicationController::current_user 
ApplicationController::current_user_session 
    User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."persistence_token" = '...' LIMIT 1 
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 31 LIMIT 1 
Redirected to http://localhost:3000/ 
Filter chain halted as :authentication rendered or redirected 
Completed 302 Found in 5ms (ActiveRecord: 1.3ms) 

Wie kann ich behebt dieses Problem? Ich habe versucht, auf Google hier auf SO zu suchen, aber leider immer noch nicht, wie man es repariert.

+0

Sie müssen mehr über das, was passiert, wie zum Beispiel, woher die Anfrage kommt und/oder ein Fehlerprotokoll. Meine Vermutung ist, dass "redirect_to: back" sendet an Ihre App zu einer der Aktionen in der before_filter Liste für: Authentifizierung an der Spitze des Controllers. – rossta

+0

@rossta Ich aktualisiere mein OP - hinzugefügt Ausgabe von Protokollen. Ja, ich leite die App auf die Aktion, die sich in der 'before_filter'-Liste befindet, auf die Aktion' edit' um. Aber zur Aktion 'edit' wird die App auch von der Aktion' update' weitergeleitet - und das funktioniert gut. Außerdem, wenn ich die Weiterleitung entferne und dann manuell die "Home URL" meiner App einrichte, bekomme ich den gleichen Fehler ... – user984621

Antwort

3

Ich habe diesen Fehler nur mit einem meiner Benutzer.

Es stellte sich heraus, dass der Benutzer ein Feld mit mehr Text als erlaubt hatte (wenn wir kürzlich eine Längenvalidierung hinzugefügt hatten). Da die Validierung neu war und der Benutzer bereits vorhanden war, wurde dieser Fehler weiterhin angezeigt.

Ich habe es gefunden, wenn ich versuche, seine Attribute mit "!" die Fehler explizite

> User.last.update_attributes!(:email => "[email protected]") 

Benutzerlast (0,3 ms), um users SELECT. * FROM users ORDER BY users. id DESC LIMIT 1 (0,1 ms) User BEGIN exists (0,2 ms) SELECT 1 AS ein VON users WHERE (users. email = '[email protected] UND users. id! = 2020) LIMIT 1 (0,1 ms Rollback) Active :: RecordInvalid: Validierung fehlgeschlagen: Zusammenfassung ist zu lang (maximal 650 Zeichen) den Inhalt dieses Feldes „Zusammenfassung“ gelöst

So verändert sich.

+0

+1 für "!" - Trick. Hatte keine Ahnung davon und es führte zur Lösung dieses Problems für mich. – Kasperi

5

Die Filterkette wird angehalten, wenn Sie irgendwo von before_filter umleiten. Wenn alles korrekt funktioniert, können Sie diese Nachricht ignorieren