2011-02-14 15 views
17

Devise me está dando un tiempo bastante difícil. Por ahora, todo lo demás parece estar funcionando, excepto la redirección de suscripción. Quiero idear el redireccionamiento al controlador de mi ciudad en index action, al registrarse o iniciar sesión (el inicio de sesión realmente funciona).Diseñar redirigir después de iniciar sesión

He intentado anular RegistrationsController y he intentado añadir una función applicationsController como:

def after_sign_in_path_for(resource_or_scope) 
    if resource_or_scope.is_a?(User) 
     town_path 
    else 
     super 
    end 
    end 

Aún así, estoy consiguiendo el mismo error:

NoMethodError in User/townController#index 

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.* 

En serio, no puedo encontrar una forma de hacerlo Alguna idea, por favor? :)

EDIT: mis rutas

 new_user_session GET /users/sign_in(.:format)      {:action=>"new", :controller=>"devise/sessions"} 
      user_session POST /users/sign_in(.:format)      {:action=>"create", :controller=>"devise/sessions"} 
    destroy_user_session GET /users/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"} 
     user_password POST /users/password(.:format)      {:action=>"create", :controller=>"devise/passwords"} 
    new_user_password GET /users/password/new(.:format)     {:action=>"new", :controller=>"devise/passwords"} 
    edit_user_password GET /users/password/edit(.:format)     {:action=>"edit", :controller=>"devise/passwords"} 
         PUT /users/password(.:format)      {:action=>"update", :controller=>"devise/passwords"} 
    user_registration POST /users(.:format)        {:action=>"create", :controller=>"devise/registrations"} 
new_user_registration GET /users/sign_up(.:format)      {:action=>"new", :controller=>"devise/registrations"} 
edit_user_registration GET /users/edit(.:format)       {:action=>"edit", :controller=>"devise/registrations"} 
         PUT /users(.:format)        {:action=>"update", :controller=>"devise/registrations"} 
         DELETE /users(.:format)        {:action=>"destroy", :controller=>"devise/registrations"} 
        root  /(.:format)         {:action=>"index", :controller=>"home"} 
      user_root  /user(.:format)        {:action=>"index", :controller=>"user/town"} 
        home  /home(.:format)        {:action=>"index", :controller=>"home"} 
        town  /town(.:format)        {:action=>"index", :controller=>"town"} 
       inbox  /messages(.:format)       {:action=>"index", :controller=>"messages"} 
       inbox  /messages/inbox(.:format)      {:action=>"inbox", :controller=>"messages"} 

routes.rb:.

devise_for :users 

    root :to => "home#index" 

    namespace :user do 
    root :to => "town#index" 
    end 

    scope :path => '/home', :controller => :home do 
    match '/' => :index, :as => 'home' 
    end 

    scope :path => '/town', :controller => :town do 
    match '/' => :index, :as => 'town' 
    end 
...... 
+0

nos demuestra sus rutas a través de '$ rastrillo routes' favor – raidfive

+0

Gracias, he añadido las rutas pertinentes, nos – Spyros

+1

Mostrar su directiva legado dentro de su routes.rb. Por lo que se ve, el recurso no es un Usuario. Averigua qué clase es en realidad. – Dex

Respuesta

11

Así es como lo hice funcionar.

# In your routes.rb 
match 'dashboard' => 'user_dashboard#index', :as => 'user_root' 

continuación, asegúrese de que usted no tiene un conjunto before_filter :authenticate_user! en su controlador home#index.

+1

Desde Devise 1.2.rc, ha habido una manera preferida de lograr esto en Devise Wiki https://github.com/plataformatec/devise/wiki/ How-To% 3a-Redirigir-a-una-página-específica-en-exitosa-registrarse-% 28registro% 29 http://stackoverflow.com/a/6402730/544068 – qsun

6

Puesto que nadie está respondiendo voy a interrumpiría ¿Seguro que este es el código que está causando el error ? Su resource_or_scope siendo nil hace que parezca que el problema es Devise, pero dudo que sea el caso. Entonces creo que el problema está en otro lado.

Probaré lo siguiente solo para asegurarme de que funciona primero.

def after_sign_in_path_for(resource) 
    "http://www.google.com" 
    end 

Si eso funciona, entonces trate de comprobar la variable resource para asegurarse de que no es nula.

+0

hola, en realidad he intentado exactamente el mismo código antes y solo funciona al iniciar sesión.Pero no al iniciar sesión después de iniciar sesión. – Spyros

+0

desde la wiki de Devise * Después de iniciar sesión en un usuario, confirmar la cuenta o actualizar la contraseña, Devise buscará una ruta de raíz delimitada para redirigir. Ejemplo: Para un recurso de usuario, usará user_root_path si existe *. Veo que tienes un 'user_root' en tus rutas. ¿Es ahí donde termina? – Dty

+0

Tengo espacio de nombre: usuario do raíz: to => "town # index" final y de hecho termina en la ciudad/índice al iniciar sesión. Sin embargo, cuando un nuevo usuario se registra y se inicia sesión (diseñar el comportamiento predeterminado), Obtengo el error anterior (aún se redirecciona a la ciudad/índice, pero con ese error, que parece que no tengo el objeto current_user). – Spyros

2

¿Has probado sobreescribir el método sign_in_and_redirect; Funcionará para usted

def sign_in_and_redirect(resource_or_scope,resource) 
    if resource_or_scope == :user 
     redirect_to town_path 
    else 
     super 
    end 
end 
+0

agregó eso a mi controlador de registros personalizado, pero sigue recibiendo el mismo error:/ – Spyros

0

Tuve un problema similar. Eventualmente recurrió a la declaración if en el controlador de la aplicación. Si el usuario inició sesión y no tiene un perfil, diríjase a la nueva vía de acceso de perfil

1

No estoy seguro si esto es útil o no, pero me encontré con los mismos problemas pero la diferencia es que estoy usando un controlador de registros personalizado.

Desde el código fuente de la herramienta para RegistrationsController aparece que está llamando a sign_in_and_redirect que a su vez lo pasa a redirect_location method.

Anulo el redirect_location para simplemente devolver la ruta de after_sign_up_path_for (resource) en lugar de stored_location_for (scope) || after_sign_up_path_for (recurso).

Dentro after_sign_up_path_for (recurso), puedo personalizar el método para redirigir al camino correcto basado en el tipo de usuario

Obras en Rails 3.0.5 y 1.3.0 idear para mí.

14

Im usando Devise 1.3.4 con Ruby On Rails 3.0.7.Después de comprobar el Internet para una solución, lo que hice fue simplemente pegando el siguiente código

* primero) * Para redirigir después de un signo exitosa hasta la página de bienvenida, lugar en el siguiente /config/routes.rb (nota, sustituir :user con el argumento de que ya ha proporcionado a devise_for):

namespace :user do 
root :to => "welcome#index" 
end 

* segundo) * para redirigir después de un cartel de fuera (a la página de bienvenida también), lugar en el directorio/app/controllers/application_controller .rb este método:

private 
# Overwriting the sign_out redirect path method 
def after_sign_out_path_for(resource_or_scope) 
welcome_index_path 
end 

Esto funcionó para mí, espero que lo haga para todos ustedes.

1

La cuestión es que no pasa por Idear after_sign_in_path_for(resource) al acceder a un recurso que se acaba de crear. Lo que necesita es after_sign_up_path_for(resource):

# override in your ApplicationController or custom Devise::RegistrationsController 
def after_sign_up_path_for(resource) 
    if resource.is_a?(User) 
    town_path 
    else 
    super 
    end 
end 

No obstante, deberá su anulación after_sign_in_path_for(resource) para redirigir correctamente ins signo posteriores al recurso.

1

Lo que Tony dijo. El espacio de nombres no está destinado a ser usado de esta manera. No sé a quién se le ocurrió este hack que no funciona para nada, pero desafortunadamente es una de las primeras soluciones que surgen cuando se busca en Google.

namespace :user do 
    root :to => "town#index" 
end 

conjuntos '/ usuario' como el user_root_path y apunta a la acción index de 'usuario/pueblo' controlador que usted no tiene. Lo que tienes es el controlador 'ciudad'. Y es por eso que obtuviste el error. Lo que necesita es

get '/town', to: 'town#index', as: 'user_root' 

De esta manera, '/ pueblo' apunta a 'ciudad # index' y está configurado como su user_root_path, que es lo Diseñar redirige a cuando el usuario

  1. signo en
  2. de registro
  3. actualización de la contraseña

por lo que ni siquiera es necesario para anular after_sign_in_path_for, que, al contrario de w que muchos creen, no es el mejor lugar para abordar el problema de redireccionamiento del dispositivo.

on Rails 4.1 + 3.2 e idear

+1

Todo lo que tiene razón. necesitamos editar su 'como:' raíz_usuario 'con las comillas y asegurarnos de que no use 'towns_path' en ninguna parte o tendrá que cambiarlas también, ya que habrá un error en el uso de esa aplicación en su aplicación . – pjammer

Cuestiones relacionadas