2010-07-23 130 views
0

我将以我刚刚接触RoR的事实为序。我有一个驻留在嵌套模块中的类::Physical::Users::User。该代码被组织到诸如app \ controllers \ physical \ users之类的路径中。不正确的嵌套模块路由

我的问题是当我尝试使用form_for这样的:

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

我得到的错误ActionView::TemplateError undefined method 'physical_users_users_path'

我明白,这有轨期待不符合我的路线做。为了使我的应用程序工作,使资源:用户直接进入正确的目录(以便我不必使用http:\ myurl.com \ physical \ users \ users \ 1',我将以下内容我的routes.rb文件:

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

当我运行“>耙路线”我得到如下:

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) 

是否有较短的URL保持我的用户资源,并得到form_for的方式寻找正确的路线?

再次,我是新的,所以如果在这个解释中有什么我不知道的话, 让我知道!

-

响应于下面的答复时,控制器驻留在应用程序/控制器/物理/用户/ users_controller.rb。

更改路由使用像命名空间:

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

产生是什么form_for正在寻找一致的路线,但后来我失去了使用URL http能力:\ mysite.com \用户\ 1。

感谢您的帮助!

+0

你能解释你的控制器被命名的原因:controller =>“physical/users/users”? - 通常它只是“用户” – 2010-07-23 01:26:04

+0

另外 - 什么是您的users_controller文件的完整路径?是/app/controllers/physical/users_controller.rb?或者它是/app/controllers/physical/users/users_controller.rb? – 2010-07-23 12:48:10

+0

我正在关注Dan Chak的[Enterprise Rails](http://oreilly.com/catalog/9780596515201)。物理层指示与物理数据库模型交互的类,而逻辑层中的类则处理构建在业务逻辑之上的类等。 – 2010-07-23 13:02:22

回答

0

我找到工作其实答案杰西Wolgamott和sespindola的回答的组合。我已经把它们都投了票。我放在我的routes.rb文件中的以下内容:

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

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

如果这似乎缺憾,并没有真正做到这一点的最好办法,发表评论。感谢所有的帮助!

+0

你不应该同时需要users.resource:users和map.resources:用户 - 你的路由文件中只有一个应该存在。我建议你避开复杂的方案,并保持简单。如果你有一个控制器资源(作为你系统中的头等公民),只需要一个map.resources:用户。 – 2010-07-25 22:56:47

1

在路线,你必须代表模块,命名空间:

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

我试过这个,脚本/服务器抱怨。你的意思是: map.namespace:physical do | physical | physical.namespace:用户do | users | users.resources:users end end 这样做的意义在于它创建了正确的路径,但是我将如何确保path/users /:id转到physical/users/users_controller? – 2010-07-23 13:11:56

1

同意@sespindola,但在应用程序\控制器,该控制器\身体\用户---我认为这是一个命名空间问题

我想这可能为你工作:

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

如果是这样,你的答案是正确的。 我以为他有应用程序/控制器/物理/用户/用户的控制器。 – sespindola 2010-07-23 03:00:22

+0

对!我会让他确认 – 2010-07-23 12:40:18