2010-07-21 16 views
7

que estoy tratando de conseguir mi cabeza alrededor de éste:Rieles: redirigir dos últimas páginas

Digamos que tiene dos modelos en los que:

: Barra de has_many: Foos

y tiene una url como este: http://myapp.com/24-name-of-the-bar-to-param/foos/new

En mi sitio, esta página muestra mucha información sobre la barra por la que los usuarios crearán un foo. Por lo tanto, incluso si un usuario no está conectado, el usuario aún podrá ver la información.

Actualmente, cuando el usuario inicia sesión, se encuentra un formulario para crear un nuevo foo en el lado izquierdo de la página web. Cuando el usuario no está conectado dice "Inicie sesión o regístrese"

El formulario explica mucho sobre cómo funciona mi aplicación, por lo que me gustaría cambiarla para que incluso si un usuario no está conectado se mostrará el formulario, y si hacen clic en enviar, los llevará al login_path y luego, cuando inicien sesión, volverán a la ruta donde enviaron el formulario.

estoy corriendo en este problema: Actualmente tengo un método login_required en mi controlador de aplicación como esta: acción requerida

def store_location 
      session[:return_to] = request.request_uri 
    end 
def login_required 
    unless current_user || admin? 
     store_location 
     flash[:notice] = "Please log in" 
     redirect_to login_path and return false 
    end 
end 

Esta entrada se llama en la acción create del foo. Cuando hago clic en enviar en el formulario me lleva a http://myapp.com/foos en lugar de http://myapp.com/24-name-of-the-bar-to-param/foos/new

Supongo que esto se debe a que se llama a la función de inicio de sesión en la acción de creación y no en la acción nueva.

¿Alguna idea?

ACTUALIZACIÓN según la petición aquí está el código del controlador y devoluciones de llamada:

before_filter :find_bar, :except => [:index, :edit, :update] 
    before_filter :login_required, :only => [:create] 
    ssl_required :edit, :update 


    def new 
    @foo = Foo.new :amount => "0.00" 
    @foos = Foo.find(:all, :conditions => ["bar_id = ?", @bar.id], :order => "created_at DESC").paginate :page => params[:page], :per_page => 10 
    @foos_all = Foo.find(:all, :conditions => ["hatlink_id = ?", @hatlink.id], :order => "created_at DESC") 
    @current_user = current_user 
    @topfooers = User.bar_amount(@bar, nil) 
    @average_foo = @bar.foos.average('amount') 
    end 

    def create 
    @foo = @current_user.foos.build params[:foo] 
    if (@bar.foos << @foo) 
    flash[:notice] = "Thank you for fooing!" 
    redirect_to new_bar_foo_path(@bar) 
    else 
    render :action => :new 
    end 
    end 
private 
    def find_bar 
@bar_id = params[:bar_id] 
return(redirect_to(categories_path)) unless @bar_id 
@bar = Bar.find(@bar_id) 
    end 
+0

Estoy interesado en la historia de la problem.:-) –

+0

Publique el código de acción create y before_filters u está usando –

+0

¿Podríamos ver las acciones del controlador? – davidcelis

Respuesta

1

Tonta de mí para llegar a una solución solo cinco minutos después de publicar la pregunta. Oh, bueno, esto es lo que hice (y funciona).

En la "nueva" acción de foo que añaden estas líneas

if !current_user 
    store_location 
end 

En el método de inicio de sesión requerida He añadido este:

if params[:controller] == "foos" && params[:action] == "create" 
       #Took out the line for storing the location in this method. 
        flash[:notice] = "Please log in" 
       redirect_to login_path and return false 
+0

ayer descubrí que el dispositivo (si es de donde proviene ese usuario actual) tiene un método de ayuda user_signed_in? (que probablemente haga lo mismo) – ecoologic

3

Se puede almacenar la URL de referencia (si está presente) & redirigen a la página si la solicitud fue un POST o PUT. Algo como:

def store_location 
    if request.post? || request.put? 
    session[:return_to] = request.env['HTTP_REFERER'] 
    else 
    session[:return_to] = request.request_uri 
    end 
end 
+0

Gracias jdesno! Eso probablemente funcionaría. Creo que se me ocurrió una solución propia. Lo publicaré a continuación para el escrutinio de otras personas. –

Cuestiones relacionadas