2010-07-21 2 views
7

Je suis en train d'obtenir ma tête autour de celui-ci:Rails: redirect deux pages en arrière

Supposons que vous avez deux modèles où:

: bar has_many: foos

Et vous avez une url comme ceci: http://myapp.com/24-name-of-the-bar-to-param/foos/new

Sur mon site cette page montre beaucoup d'informations sur la barre pour laquelle les utilisateurs vont créer un foo. Ainsi, même si un utilisateur n'est pas connecté, l'utilisateur pourra toujours voir les informations.

Actuellement, lorsque l'utilisateur est connecté, un formulaire pour créer un nouveau foo est sur le côté gauche de la page Web. Lorsque l'utilisateur n'est pas connecté il est dit "Merci de vous connecter ou de vous inscrire"

Le formulaire explique beaucoup de choses sur le fonctionnement de mon application, aussi j'aimerais le changer de façon à ce que même si un utilisateur n'est pas connecté le formulaire s'affichera, et s'il clique sur submit, il les emmènera sur le login_path puis, une fois connecté, sur le chemin où le formulaire a été envoyé.

Je suis en ce problème: Actuellement, j'ai une méthode login_required dans mon contrôleur d'application comme ceci:

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 

Cette connexion action requise est appelée à l'action de créer de la foo. Lorsque je clique sur soumettre sur le formulaire, il m'amène à http://myapp.com/foos au lieu de http://myapp.com/24-name-of-the-bar-to-param/foos/new

Je suppose que c'est parce que la fonction de connexion requise est appelée sur l'action de création et non sur la nouvelle action.

Des idées?

Mise à Jour par demande est ici le code du contrôleur et callbacks:

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

Je suis intéressé par l'histoire de la problem.:- –

+0

Veuillez poster le code de create action et before_filters vous utilisez –

+0

Pourrions-nous voir les actions du contrôleur? – davidcelis

Répondre

1

Idiote de moi de trouver une solution juste cinq minutes après avoir posté la question. Eh bien, voici ce que j'ai fait (et ça marche).

Dans la « nouvelle » action de foo j'ajouté ces lignes

if !current_user 
    store_location 
end 

Dans la méthode de connexion requise J'ai ajouté ceci:

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

hier, j'ai trouvé cette machine (si c'est là que vient current_user) a une méthode d'assistance user_signed_in? (ça fait probablement la même chose) – ecoologic

3

Vous pouvez stocker l'URL de référence (si elle est présente) & redirigent vers cette page si la demande était un POST ou PUT. Quelque chose comme:

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

Merci jdesno! Cela fonctionnerait probablement. Je pense que j'ai juste trouvé une solution à moi. Je l'afficherai ci-dessous pour l'examen des autres. –

Questions connexes