2012-09-27 43 views
5

Todavía aparece el mensaje de error en el título y no sé cómo resolverlo. En el ApplicationController,Rails 3 - Cadena de filtro detenida como: autenticación procesada o redirigida

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 

en el 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 

y la 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 
... 

Siempre cuando se actualiza el activo atributo, voy a hacer llegar el mensaje localhost Redirigido: 3000/ cadena de filtros detenido como: autentificación prestado o redirigida

EDIT: producción adicional de archivo de registro:

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) 

¿Cómo puedo arreglar este problema? He intentado buscar en google aquí en SO, pero desafortunadamente todavía no sé, cómo solucionarlo ...

+0

Deberá mostrar más información sobre lo que está sucediendo, como de dónde viene la solicitud y/o un registro de errores. Supongo que "redirect_to: back" está enviando a su aplicación una de las acciones en la lista de filtros anteriores para: autenticación en la parte superior de su controlador. – rossta

+0

@rossta Actualizo mi OP - agregué salida de los registros. Sí, redirijo la aplicación a la acción, que está en la lista 'before_filter', a la acción' edit'. Pero para la acción 'edit' también se redirige la aplicación desde la acción' update' y esto está funcionando bien. Además, si elimino el redireccionamiento y luego configuro manualmente la 'url de inicio' de mi aplicación, entonces obtengo el mismo error ... – user984621

Respuesta

3

Recibí ese error solo con uno de mis usuarios.

Resultó que el usuario tenía un campo (recientemente se agregó una validación de longitud) con más texto que el permitido. Como la validación era nueva y el usuario ya estaba allí, ese error siguió apareciendo.

Lo encontré al intentar actualizar sus atributos usando "!" para que los errores explícita

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

Carga de usuarios (0.3ms) SELECT users. * FROM usersusers ORDER BY. id DESC LIMIT 1 (0,1 ms) comienzan usuario existe (0,2 ms) Seleccione 1 como uno DE DONDE users (users. email = '[email protected]' Y users. id! = 2020) LIMIT 1 (0,1 ms) RETROCEDERÁ ActiveRecord :: RecordInvalid: Error de validación: Resumen es demasiado largo (el máximo es 650 caracteres)

tanto, cambiar el contenido de ese campo "Resumen" resolvió.

+0

+1 para "!" - truco. No tenía idea de eso y me llevó a solucionar este problema. – Kasperi

5

la cadena del filtro se detiene cuando se está redirigiendo hacia algún lugar desde before_filter. si todo funciona correctamente, puede ignorar este mensaje

Cuestiones relacionadas