2011-05-24 28 views
14

Estoy intentando configurar un formulario de inicio de sesión en mi página de inicio. Logré hacerlo siguiendo el WikiRails & Devise: Anular SessionsController

Excepto que, si las informaciones de inicio de sesión son incorrectas, se representa /devise/session/new.html.erb. No quiero eso. Quiero que mi usuario sea redirigido al root_urlCON los errores en un mensaje flash.

Pude anular registrations_controller.rb por otra característica pero anular sessions_controller.rb me da un montón de problemas.

¿Qué voy a cambiar para hacer lo que quiero? Todavía quiero que el usuario sea redirigido al after_sign_in_path si el inicio de sesión fue correcto. El controlador original es here

Hasta ahora, sé que tengo que hacer eso en mi routes.rb

devise_for :users, :controllers => { :registrations => "registrations", :sessions => "sessions" }

Y también configurar controller/sessions_controller.rb

class SessionsController < Devise::SessionsController 

    # GET /resource/sign_in 
    def new 
    resource = build_resource 
    clean_up_passwords(resource) 
    respond_with_navigational(resource, stub_options(resource)){ render_with_scope :new } 
    end 

end 

tengo la sensación de que Tengo que cambiar el render_with_scope :new pero ... ¿cómo? Con esa versión, me sale el error undefined method 'users_url' for #<SessionsController:0x5072c88>

Bueno, voy a esperar a su preciosa ayuda

PS: Eso post me ayudó mucho para el manejo de errores en la suscripción. Tal vez ayude a iniciar sesión en los errores?

==== ==== EDITAR

Siguiendo el consejo respuesta 1º, también añade a initializers/devise.rb:

config.warden do |manager| 
    manager.failure_app = CustomFailure 
end 

Cuando el usuario no se registra y trata de acceder a un " zona restringida", que se redirige a root_url pero cuando el signo va mal, ahora tengo el siguiente error:

The action 'devise/sessions#new' could not be found for Devise::SessionsController 

(PS: He eliminado todo lo que hice con el controlador de la sesión y el registro de las obras si tiene éxito)

=== === EDIT 2

Después de esta Wiki la redirección funciona perfectamente PERO Pongo No tiene ninguna notificación de error.

Y estoy mostrando el mensaje de alerta de flash/aviso de que si eso cambia nada

<% flash.each do |name, msg| %>   
    <% if msg.class == Array %> 
    <% msg.each do |message| %> 
    <%= content_tag :p, message, :id => "flash_#{name}" %> 
    <% end %> 
    <% else %>   
    <%= content_tag :p, msg, :id => "flash_#{name}" %>   
    <% end %> 
<% end %> 

INFORME FINAL DE ACTUALIZACIÓN === ===

Las obras respuesta aceptada.Simplemente no se olvide de mostrar flash alerts

+1

Finalmente! Una pregunta que responde mi eterna duda. –

Respuesta

15

Tiene que anular su Clase de diseño de falla personalizada.

Añadir esta clase fracaso personalizada en lib/custom_failure.rb

class CustomFailure < Devise::FailureApp 
    def respond 
    if http_auth? 
     http_auth 
    elsif warden_options[:recall] 
     recall 
    else 
     redirect 
    end 
    end 

    def redirect 
     store_location! 
     flash[:alert] = i18n_message unless flash[:notice] 
     redirect_to "/" 
    end 

    def recall 
    env["PATH_INFO"] = attempted_path 
    flash.now[:alert] = i18n_message(:invalid) 
    self.response = recall_controller.action(warden_options[:recall]).call(env) 
    end 

    protected 

    def i18n_message(default = nil) 
    message = warden.message || warden_options[:message] || default || :unauthenticated 

    if message.is_a?(Symbol) 
     I18n.t(:"#{scope}.#{message}", :resource_name => scope, 
      :scope => "devise.failure", :default => [message, message.to_s]) 
    else 
     message.to_s 
    end 
    end 

    def warden_options 
    env['warden.options'] 
    end 

    def warden 
    env['warden'] 
    end 

    def recall_controller 
    "#{params[:controller].camelize}Controller".constantize 
    end 


    def attempted_path 
    warden_options[:attempted_path] 
    end 

    def store_location! 
    session[:"#{scope}_return_to"] = attempted_path if request.get? && !http_auth? 
    end 

    def attempted_path 
    warden_options[:attempted_path] 
    end 

    def http_auth? 
    !Devise.navigational_formats.include?(request_format) || (request.xhr? && Devise.http_authenticatable_on_xhr) 
    end 
end 

Escribir esto bajo config/application.rb

config.autoload_paths += %W(#{config.root}/lib) 

_________________Edit __________________

Usted dijo cuando el 'registro va mal ', esto significa que el control debe estar en el método registrations_controller create. Algo debe estar mal allí, supongo. Intenta agregar estas rutas.

devise_for :users 

    devise_scope :user do 
    root :to => "devise/sessions#new" 
    get "sign_in", :to => "devise/sessions#new" 
    get "sign_out", :to => "devise/sessions#destroy" 
    get "sign_up", :to => "devise/registrations#new" 
    end 

________________Edit 2 ________________

Añadir esto en vistas/diseñar/registros/new.html.erb

<%= devise_error_messages! %> 
+0

No funcionó. ¿Debo agregar algo para que Rails tenga en cuenta este archivo? – Lucas

+0

tiene que agregar config.autoload_paths + =% W (# {config.root}/lib) en el archivo config/application.rb ¿cuál es el error? Solo tienes que instalar la gema de diseño. –

+0

Actualicé mi publicación con tu respuesta. :) – Lucas

3

Si se está ejecutando en el error undefined method 'users_url' for #<SessionsController:0x5072c88> al redefinir el controlador sesiones Idear puede proporcionar un nombre de ruta como a continuación. La adición importante que te perdiste es el , :as => :users.

devise_scope :user do 
    root :to => "devise/sessions#new", :as => :users 
    get "sign_in", :to => "devise/sessions#new" 
    get "sign_out", :to => "devise/sessions#destroy" 
    get "sign_up", :to => "devise/registrations#new" 
    end 

El nombre de la ruta anterior podría entrar en conflicto con las rutas existentes o futuros. Como alternativa, he encontrado que esta configuración tiende a funcionar bien:

devise_for :users, 
    :path_names => { :sign_out => 'logout', 
         :sign_in => 'login', 
         :sign_up => 'register' }, 
    :controllers => { :sessions => 'users/sessions' } do 

     # Sessions 
     post '/login'   => 'users/sessions#create',  :as => :user_session 
     get '/login'   => 'users/sessions#new',   :as => :new_user_session 
     get '/logout'  => 'users/sessions#destroy',  :as => :destroy_user_session 

     # Passwords 
     post '/password'  => 'devise/passwords#create',  :as => :user_password 
     put '/password'  => 'devise/passwords#update' 
     get '/password/new' => 'devise/passwords#new',  :as => :new_user_password 
     get '/password/edit' => 'devise/passwords#edit',  :as => :edit_user_password 

     # Registrations 
     post '/register' => 'devise/registrations#create', :as => :user_registration 
     get '/register' => 'devise/registrations#new', :as => :new_user_registration 
     get '/account'  => 'devise/registrations#edit', :as => :edit_user_registration 
     put '/account'  => 'devise/registrations#update' 
     delete '/account'  => 'devise/registrations#destroy' 

    end 
0

depuración pista intento de eliminar cualquier registro (un usuario sería coherente); si vas a la acción de mostrar, no es una cuestión de configuración del dispositivo. Para este caso, síguelo (se atienden otros casos aquí)

No puedo ver en qué parte de la vista llama al archivo raíz de JavaScript.

Me he golpeado la cabeza varias veces, usando diferentes configuraciones de Javascript en diferentes diseños. Sea cual sea su cabecera se lee, la llamada

<%= javascript_include_tag 'my-differntly-fangled-application' %> 

tiene que tener el archivo de manifiesto relevantes incluyen

//= require jquery 
//= require jquery_ujs 
Cuestiones relacionadas