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?
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
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