2010-10-28 1 views
1

Je tente simplement de mettre en place des liens de base avec authlogic. ici, ils sontRuby on Rails: problème de routage: l'action n'est pas visible dans link_to

<% if current_user %> 
    <div class="register_new_user"> 
     <%= link_to "Register", new_user_path %> 
    </div> 
    <div class="login_existing_user"> 
     <%= link_to "Log In", new_user_session_path %> 
    </div> 

<% else %> 
    <div class="logout"> 
     <%= link_to "Log Out", :controller => :user_sessions, :action => :destroy %> 
    </div> 
<% end %> 

ce qui est aussi étrange est que destroy_user_session_path n'existe pas, et est ce que je préfère utiliser. Mais quand je clique sur le lien de déconnexion, il me faut pour localhost:3000/user_sessions/

voici mon contrôleur user_sessions:

class UserSessionsController < ApplicationController 
    before_filter :require_no_user, :only => [:new, :create] 
    before_filter :require_user, :only => :destroy 

    def new 
    @user_session = UserSession.new 
    end 

    def create 
    @user_session = UserSession.new(params[:user_session]) 
    if @user_session.save 
     flash[:notice] = "Login successful!" 
     redirect_back_or_default account_url 
    else 
     render :action => :new 
    end 
    end 

    def destroy 
    current_user_session.destroy 
    flash[:notice] = "Logout successful!" 
    redirect_back_or_default new_user_session_url 
    end 
end 

, je suis confus quant à pourquoi new_user_session_path œuvres et destroy_user_session_path ne fonctionne pas.

pour référence: mes itinéraires:

map.resource :user_session 
    map.resource :account, :controller => "users" 
    map.resources :users 

    map.root :controller => "info", :action => "home" 
    map.connect "/home", :controller => "info", :action => "home" 
+0

pouvez-vous nous donner une sortie 'rake routes'. Aussi, votre if/else est en arrière dans la vue: si l'utilisateur actuel, vous voulez qu'ils puissent se déconnecter, sinon, inscrivez-vous/login – brad

+0

Rien de tout cela n'affecte votre problème, cependant, la réponse de Jaime est correcte – brad

Répondre

5

Est-ce à votre avis:

<%= link_to "Log Out", user_session_path, :method => :delete %> 

La raison pour laquelle vous ne pouvez pas juste une méthode destroy_user_session_path est parce que ce serait une requête GET, qui casse la convention de routage RESTful. Les requêtes GET sont uniquement destinées à récupérer des données, pas à les créer, les mettre à jour ou les détruire.

Cela devrait résoudre votre problème.

0

Pour UPDATE et DELETE vous devez fournir la méthode en tant que paramètre:

<%= link_to "Log Out", user_session_path, :method => :delete %> 
0

Je pense que vous devriez utiliser:

<%= link_to "Log Out", :controller => :user_session, :action => :destroy %> 

Notez que le contrôleur au singulier ...

+0

Cela ne marchera pas , il envoie toujours une requête GET à une action qui répond uniquement à une demande DELETE. –