2011-04-20 10 views
16

Estoy escribiendo una aplicación de rieles en el que tengo un editor y un modelo de publicación. Estoy usando un dispositivo para la autenticación de los editores y, dado que un editor no puede hacer nada como invitado, escribí un diseño personalizado para usar en la página de inicio de sesión y quiero que un usuario invitado pueda ver solo la página de inicio de sesión.Diferente '/' ruta raíz para los usuarios, dependiendo si son autenticados (usando idear)

Ahora estoy tratando de alcanzar el siguiente comportamiento en mi aplicación, pero sin éxito:

require 'spec_helper' 
require 'capybara/rails' 

describe "Authentication" do 

    describe "when logged in" do 
    before(:each) do 
     @editor = Factory(:editor, :password => 'secret') 
     visit '/' 
     fill_in 'Login', :with => @editor.login 
     fill_in 'Password', :with => 'secret' 
     click_button 'Sign in' 
     page.should have_content('Signed in successfully.') 
    end 

    it "getting/should render publication page with no redirection" do 
     visit '/' 
     page.should_not have_content('Login') 
     page.should have_content('Publications') 
     # assert that there is no redirection 
     page.current_path.should == '/' 
    end 

    it "visits the sign_in page should redirect to /" do 
     visit '/editors/sign_in' 
     page.should have_content('Publications') 
     page.current_path.should == '/' 
    end 

    end 

    describe "when not logged in" do 
    it "getting/should not display the sign in warning" do 
     visit '/' 
     # I want to get rid of this message 
     page.should_not have_content('You need to sign in or sign up before continuing.') 
    end 

    it "getting/should not redirect to the sign_in default page" do 
     visit '/' 
     page.should have_content('Login') 
     # assert that there is no redirection 
     page.current_path.should == '/' 
    end 

    it "getting the the sign_in default path works" do 
     visit '/editors/sign_in' 
     page.should have_content('Login') 
     page.current_path.should == '/editors/sign_in' 
    end 

    it "login works and redirect me to the publications page (with /)" do 
     @editor = Factory(:editor, :password => 'secret') 
     visit '/' 
     fill_in 'Login', :with => @editor.login 
     fill_in 'Password', :with => 'secret' 
     click_button 'Sign in' 
     page.should have_content('Signed in successfully.') 
     page.current_path.should == '/' 
     page.should have_content('Publications') 
    end 
    end 
end 

El principal problema es que quiero para deshacerse de 'Tienes que iniciar sesión o registrarse antes de continuar. ' mensaje cuando un usuario invitado visita '/'.

He intentado con sugerencias tomadas de here y here pero sin suerte.

Cualquier sugerencia sobre cómo aplicar esto con legado?

Gracias.

+0

Parece que podría hacer para crear un espacio de nombres ... ¿Ha considerado esto? –

+0

¿Qué quieres decir? ¿Podrías explicar? Gracias. – Fabio

Respuesta

24

This post explican cómo lograr que:

authenticated :user do 
    root :to => "main#dashboard" 
end 

root :to => "main#index" 

Aquí es el pull request que implementan esto con algunos detalles técnicos

+1

Seguí sus instrucciones, pero obtuve los errores sobre las rutas duplicadas a las que alude @wildmonkey. Especificar 'como:' fue un paso importante que me faltaba. – doub1ejack

0

Sí, este tema fue muy frustrante para mí también.

En última instancia Acabé ocultar el mensaje de flash en las sesiones # nueva página. No es una gran solución en absoluto ya que algunas veces usted/hace/quiere que aparezca ese mensaje ...

Me rendí después de un tiempo, pero me pregunto si podría usar este approach, pero coloque una bandera dentro de esa lambda y tenga un before_filter en su controlador de sesiones que vacía el flash si está presente. Algo así como ...

#routes 
=> 'users#dashboard', :constraints => lambda {|r| r.env["skip_flash"] = true; r.env["warden"].authenticate? } 


#sessions_controller.rb 
before_filter :only=>[:new] do 
    flash[:notice] = nil if request.env["skip_flash"] 
    request.env["skip_flash"] = false 
end 

No estoy muy familiarizado con cómo funcionan las rutas y el objeto de solicitud ... pero solo una idea. Esto sería desactivar el mensaje de flash sólo cuando usted está tratando de acceder a los "/" y no otras páginas ..

espero que alguien tiene una buena solución!

+0

Yo también, no me gusta este tipo de solución. – Fabio

28

Creo que deberías usar algo así

authenticated :user do 
    root :to => 'users#index', as: :authenticated_root 
end 
root :to => 'welcome#index' 

desde rails4 no permite rutas con el mismo nombre que necesita para especificar como:

+5

esta es la respuesta más correcta/actualizada – sixty4bit

5
authenticated :user do 
    root :to => 'home#index', :as => :authenticated_root 
end 
root :to => redirect('/users/sign_in') 

Directamente desde la boca del caballo en el How to's for the devise gem. : D

1

También debido a que necesita para nombrar estos caminos de la raíz en los carriles 4 puede encontrarse con que es molesto cuando se quiere sólo tiene que utilizar root_path en dicen que su logotipo para llevarlo de regreso al tablero de instrumentos o página de inicio, respectivamente. Acabo de crear ayudantes en el ApplicationHelper que lo resuelve fácilmente.

module ApplicationHelper 
    def root_path 
    if user_signed_in? 
     authenticated_root_path 
    else 
     unauthenticated_root_path 
    end 
    end 

    def root_url 
    if user_signed_in? 
     authenticated_root_url 
    else 
     unauthenticated_root_url 
    end 
    end 
end 
Cuestiones relacionadas