2010-07-23 4 views
0

Je vais commencer par le fait que je suis nouveau sur RoR. J'ai une classe qui réside dans un module imbriqué, ::Physical::Users::User. Le code est organisé en chemins tels que app \ controllers \ physical \ users.Itinéraires de module imbriqués incorrects

Mon problème vient quand je tente d'utiliser form_for comme ceci:

<% form_for @user do |f| %> 
    ... 
<% end %> 

Je reçois l'erreur ActionView::TemplateError undefined method 'physical_users_users_path'

Je comprends que cela a à voir avec des rails attendent des itinéraires qui ne correspondent pas à la mienne. Pour que mon application fonctionne de telle sorte que la ressource: users accède directement au bon répertoire (pour que je n'ai pas besoin d'utiliser http: \ myurl.com \ physical \ users \ users \ 1 ', je mets ce qui suit dans mon dossier routes.rb:

map.resources :users, :controller => 'physical/users/users' 

Quand je lance « > routes râteau » Je reçois le texte suivant:

users GET /users(.:format)     {:controller=>"physical/users/users", :action=>"index"} 
      POST /users(.:format)     {:controller=>"physical/users/users", :action=>"create"} 
new_user GET /users/new(.:format)    {:controller=>"physical/users/users", :action=>"new"} 
edit_user GET /users/:id/edit(.:format)   {:controller=>"physical/users/users", :action=>"edit"} 
    user GET /users/:id(.:format)    {:controller=>"physical/users/users", :action=>"show"} 
      PUT /users/:id(.:format)    {:controller=>"physical/users/users", :action=>"update"} 
      DELETE /users/:id(.:format)    {:controller=>"physical/users/users", :action=>"destroy"} 
       /:controller/:action/:id   
       /:controller/:action/:id(.:format) 

est-il un moyen de maintenir l'URL plus courte à ma ressource utilisateur et obtenir form_for à chercher le bon chemin?

Encore une fois, je suis nouveau, donc s'il y a quelque chose qui me manque dans cette explication, faites le moi savoir!

-

En réponse aux réponses ci-dessous, le dispositif de commande réside dans app/controllers/physique/users/users_controller.rb.

Modification du routage à utiliser les espaces de noms comme:

map.namespace :physical do |physical| 
    physical.namespace :users do |users| 
    users.resources :users 
    end 
end 

génère des itinéraires qui sont compatibles avec ce que form_for cherche, mais je perds la possibilité d'utiliser l'URL http: \ mysite.com \ users \ 1.

Merci pour l'aide jusqu'à présent!

+0

Pouvez-vous expliquer le raisonnement de votre contrôleur étant nommé: controller => "physique/users/users"? - Normalement, ce ne serait que "utilisateurs" –

+0

Aussi - quel est le chemin d'accès complet à votre fichier users_controller? est-ce /app/controllers/physical/users_controller.rb? ou est-ce /app/controllers/physical/users/users_controller.rb? –

+0

Je suis [Enterprise Rails] (http://oreilly.com/catalog/9780596515201) par Dan Chak.La couche physique indique les classes qui interagissent avec les modèles de base de données physiques, tandis que celles de la couche logique traitent des classes construites au-dessus de la logique métier, etc. –

Répondre

0

La réponse que j'ai trouvé au travail est en fait une combinaison de Jesse Wolgamott et les réponses de sespindola. Je les ai tous deux votés. J'ai placé ce qui suit dans mon dossier routes.rb:

map.namespace :physical do |physical| 
    physical.namespace :users do |users| 
    users.resources :users 
    end 
end 

map.resources :users, :controller => "physical/users/users" 

Si cela semble kludgy et pas vraiment la meilleure façon de le faire, laisser un commentaire. Merci à tous pour votre aide!

+0

Vous ne devriez pas avoir besoin à la fois de users.resource: users ET de map.resources: users - un seul devrait être présent dans vos fichiers de routes. Je vous recommande de vous détourner d'un système compliqué et de le garder simple. Si vous avez des ressources de contrôleur (en tant que citoyen de première classe dans votre système), il suffit d'avoir map.resources: users. –

1

Dans les routes, vous devez représenter les modules avec les espaces de noms:

namespace :physical do 
    namespace :users do 
    map.resources :users 
    end 
end 
+0

J'ai essayé ceci et le script/serveur s'est plaint. Vouliez-vous dire: carte.namespace: physique faire | physique | physical.namespace: les utilisateurs font | users | users.resources: users end end Cela fonctionne en ce sens qu'il crée les chemins corrects, mais comment puis-je m'assurer que le chemin/users /: id va à physical/users/users_controller? –

1

D'accord avec @sespindola, mais avec le contrôleur à des contrôleurs app \ \ utilisateurs physiques \ --- Je pense qu'il est un problème d'espace de noms

Je pense que cela peut fonctionner pour vous:

map.resources :users, :path_prefix => ':physical' 
+0

Si c'est le cas, votre réponse est la bonne. Je pensais qu'il avait le contrôleur sur app/controllers/physique/utilisateurs/utilisateurs. – sespindola

+0

Droit! Je vais lui demander de confirmer –