2009-11-18 5 views
1

J'ai un site répertoriant de nombreux travaux, mais je souhaite également que chaque compte puisse accéder à ses tâches en un seul endroit. Ainsi, je me sers de ces itinéraires:Routage conditionnel Ruby on Rails

map.resources :jobs 
map.resource :account, :has_many => :jobs 

Cela me reçoit comme URL localhost/jobs/ et localhost/account/jobs. Cependant, les deux semblent rendre JobsController::index. Comment puis-je créer un conditionnel dans l'action d'index (comment accéder au compte/job ou simplement aux jobs spécifiés dans l'URL?) Ou modifier l'itinéraire du compte pour rendre une action différente? Quelle est la bonne façon de faire cela?

+0

Avez-vous un ou plusieurs comptes? L'énoncé "Je veux aussi chaque compte ..." suggère plusieurs, mais "map.resource: account" en suggère un. – avaynshtok

Répondre

3

Vous pouvez utiliser un bloc lors de la création de vos itinéraires, puis passer un paramètre :controller, comme si

map.resource :account do |account| 
    # If you have a special controller 'AccountJobsController' 
    account.resources :jobs, :controller => "account_jobs" 
end 

Il peut être plus propre pour vous de mettre vos contrôleurs dans une structure de répertoire, puis vous peut les référencer de manière imbriquée. Par exemple:

map.resource :account do |account| 
    account.resources :jobs, :controller => "accounts/jobs" 
end 

Si vous utilisez l'extrait ci-dessus, vous devez alors créer un contrôleur dans l'application/contrôleurs/comptes/jobs_controller.rb, qui est défini comme ceci:

class Account::JobsController < ApplicationController 
    ## 
    ## etc. 
    ## 
end 

Vous pouvez toujours utilisez rake routes pour vérifier quels itinéraires ont été générés et quels contrôleurs ils vont utiliser.

+0

C'est une bonne réponse! –

0

Si vous exécutez « routes râteau » vous devriez voir quelque chose comme ça

account_jobs GET /accounts/:account_id/jobs/:job_id {:controller => 'jobs', :action => 'index'} 

Cela signifie que lorsque votre action est appelée par le vous/compte/itinéraire d'emplois devrait avoir un: paramètre account_id. Vous pouvez alors faire votre commutateur logique basée sur l'existence de ce param:

if params[:account_id].nil? 
    ... 
else 
    ... 
end 
+0

map.resource ne fonctionne pas de cette façon. – EmFi

+0

Je viens de le faire sur un projet de rails propres à valider, et oui, cela fonctionne de cette façon. Routes: ActionController :: Routing :: Routes.draw faire | map.resources: emplois carte.Ressources: comptes,: has_many =>: Emploi "routes râteau" account_jobs GET /accounts/:account_id/jobs(.:format) {: controller => "emplois",: action => "index"} get http: // localhost: 3000/accounts/123/jobs from journal: Traitement JobsController # index (pour 127.0.0.1 à 2009-11-18 11:24:22) [GET] Paramètres: {"account_id" => "123"} – avaynshtok

+0

Yikes, désolé pour le (non) formatage. Mon point étant ... quel est le sens de "cette façon" dans votre commentaire? – avaynshtok

2

Ajout d'une exigence de la définition de ressource vous permet de passer des paramètres supplémentaires

map.resources :jobs 
map.resource :account, :has_many => :jobs, :requirements => {:account => true} 

Ensuite params[:account] seront définis si le routage url était 'http://www.mysite.tld/account/jobs' et non renseigné si c'était 'http://www.mysite.tld/jobs'

Comme pour tous les autres routages reposants, l'action dépend du contexte.

  • GET demandes sans un chemin d'accès à l'index.
  • requêtes GET avec une voie id pour montrer
  • POST route des demandes de création
  • route des demandes de mise à jour
  • route des demandes SUPPRIMER pour détruire.