2010-08-05 5 views
1

J'ai un contrôleur avec les 7 actions RESTful plus une action 'courant' supplémentaire, qui renvoie le premier enregistrement actif foo:Rails 3 Ajouter une action GET au contrôleur RESTful

class FooController < ApplicationController 

    def current 

    @user = User.find(params[:user_id]) 
    @foo = @user.foos.where(:active => true).first 

    #use the Show View 
    respond_to do |format| 
     format.html { render :template => '/foos/show' } 
    end 

    end 

    #RESTful actions 
    ... 

end 

Le Foo Modèle: belongs_to l'utilisateur Modèle et le modèle de l'utilisateur: has_many Foos.

Si je structure les routes en tant que tels:

resources :users do 
    resources :foos do 
    member do 
     get :current 
    end 
    end 
end 

L'itinéraire résultant est '/ utilisateurs /: user_id/foos /: id'. Je ne veux pas spécifier le foo: id, évidemment.

J'ai aussi essayé:

map.current_user_foo '/users/:user_id/current_foo', :controller => 'foos', :action => 'current' 
resources :users do 
    resources :foos 
end 

La route qui en résulte est plus comme j'attendre: "/ utilisateurs /: user_id/current_foo.

Lorsque je tente d'utiliser cette route, je reçois une erreur qui se lit comme suit:

ActiveRecord::RecordNotFound in FoosController#current 
Couldn't find Foo without an ID 

modifier

Lorsque je déplace l'action en cours au contrôleur d'application, tout fonctionne comme prévu. La route nommée doit être en conflit avec le routage des ressources.

/modifier

Qu'est-ce que je manque? Y a-t-il une meilleure approche pour le routage?

Répondre

3

Je pense que vous voulez définir le courant sur la collection, pas le membre (le membre est ce qui ajoute l'ID:).

essayez ceci.

resources :users do 
    resources :foos do 
    collection do 
     get :current 
    end 
    end 
end 

qui devrait vous donner un itinéraire comme ceci:

current_user_foos GET /users/:user_id/foos/current(.:format)   {:controller=>"foos", :action=>"current"} 

aussi la carte n'est plus utilisé dans la RC, il vous donnera un avertissement de dévalorisation.

+0

Un peu non intuitif, mais cela a fonctionné - merci. Des pensées sur la façon de gérer le cas si un foo correspondant n'est pas trouvé? Je veux probablement montrer une page qui indique «cette personne n'a pas de truc», plutôt que de retourner à la dernière page et de montrer un message flash. – craig

+0

hmm, difficile de dire, comment l'utilisateur peut-il sélectionner un foo? Regardez-vous l'utilisateur, puis cliquez sur un bouton/suivez un lien pour rechercher les foo attribués à cet utilisateur? Si oui, je pense retourner à la page de demande, avec un avis disant, pas de foos trouvé serait ok .. – Doon

Questions connexes