2010-09-21 10 views
10

Je suis nouveau sur Rails et je suis en train d'implémenter quelques applications basiques. Commençant juste sur ma deuxième application et ai couru dans ce qui est un problème fondamental, mais Google ne me cède rien.Ruby on rails "Aucune correspondance d'itinéraire"

Obtenir cette erreur:

No route matches {:controller=>"user", :action=>"admin_login"} 

Voici mon routes.rb

Blah::Application.routes.draw do 
    resources :items, :cart, :user 
end 

Voici mon applications.html.erb (l'idée est un en-tête bien sûr, et je suis en train de créer un lien vers 'login' En ce moment, il est juste supposé mettre la variable de session 'login' à '1'

<!DOCTYPE html> 
<html> 
<head> 
    <title>Blah</title> 
    <%= stylesheet_link_tag :all %> 
    <%= javascript_include_tag :defaults %> 
    <%= csrf_meta_tag %> 
</head> 
<body> 

<div id="headerHolder"> 
    <div id="title">blah</div> 
    <div id="menu"> 
     <div class ="menuItem">blog</div> 
     <div class ="menuItem"> 
      <%= link_to "products", :controller => "items", 
            :action => "index" %> 
     </div> 
     <div class ="menuItem">contact</div>  
     <div class="menuItem"> 
      <%= link_to "cart", :controller => "cart", 
           :action => "index" %> 
     </div> 
     <div class="menuItem"> 
       <%= link_to_unless_current "admin", :controller => "user", 
                :action => "admin_login" %> 
     </div> 
    </div> 
</div> 

<div id="content"> 
    <%= yield %> 
</div> 

</body> 
</html> 

Et ceci est mon user_controller.rb

class UserController < ApplicationController 

    def index 
    end 

    def admin_login 
    session[:login] = 1 
    session[:cart] = nil 
    flash[:notice] = "Admin user successfully logged in, cart reset." 
    redirect_to :controller => :items 
    end 

end 

Que me manque dans mon routes.rb i? Ou sinon ... je suis sûr que c'est quelque chose de stupide.

Répondre

6

Vous devez ajouter admin_login méthode pour les routes, comme: -

map.connect '/user/admin_login', :controller => 'users', :action => 'admin_login' 
+0

donc la voie «ressources automatiques seulement de l'indice« poignées et les méthodes de public face à accéder via des verbes html? – Chris

+1

Oui, les méthodes générées par échafaudage sont ajoutées via les ressources. – Anubhaw

19

Pour Rails> 3, vous devez utiliser la nouvelle syntaxe de routage:

resources :items, :cart 

resource :user do 
    # Route GET /user/admin_login 
    get 'admin_login', :on => :collection 
end 

Voir Rails guides pour plus d'informations sur le routage.

2

trouver le fichier « config/routes.rb », modifier, Repérez la ligne suivante:

# See how all your routes lay out with "rake routes" 

Dans cette ligne ajoutez la ligne suivante, comme suit:

map.connect '',:controller=>"index",:action=>"index" 
1

vous pouvez utiliser

match 'admin_login' => 'user#admin_login', :as =>'admin_login' 

méthode par défaut pour cet appel est post u peut changer le comportement de la méthode en utilisant

:via => [:post/:put/:get] 
0

Il y a une nouvelle méthode dans Rails 3. Vous pouvez utiliser les éléments suivants:

get 'admin_login' => "user#admin_login"