我有两个班级:
class User < ActiveRecord::Base
:has_one :foo
end
class Foo < ActiveRecord::Base
:belongs_to :user
end
Foo是可选的。
我创建了以下路由:
resources :users do
resources :foo
end
这导致以下路线:
GET /users/:user_id/foo(.:format) {:controller=>"foos", :action=>"index"}
user_foos POST /users/:user_id/foo(.:format) {:controller=>"foos", :action=>"create"}
new_user_foo GET /users/:user_id/foo/new(.:format) {:controller=>"foos", :action=>"new"}
GET /users/:user_id/foo/:id(.:format) {:controller=>"foos", :action=>"show"}
PUT /users/:user_id/foo/:id(.:format) {:controller=>"foos", :action=>"update"}
user_foo DELETE /users/:user_id/foo/:id(.:format) {:controller=>"foos", :action=>"destroy"}
edit_user_foo GET /users/:user_id/foo/:id/edit(.:format) {:controller=>"foos", :action=>"edit"}
问题:
感谢您的时间。
答案 0 :(得分:27)
如果您的模型具有has_one关联,请尝试使用resource :foo
设置路线(请注意单数方法名称“资源”,而不是“资源”)。这将设置单例资源路由(例如,没有索引操作,并且成员操作没有id参数,因为只有一个成员)。另请参阅http://apidock.com/rails/ActionController/Resources/resource(2.3文档,但也适用于3.0以及afaik)。
答案 1 :(得分:2)
我能理解为什么克雷格实际上错过了。这是一个微妙的差异,它甚至没有超出我的想法。唯一让我感到惊讶的是,我对单身人士资源的命名路由有一个奇怪的索引名称:user_foo_index
而不是user_foos
。
由于Rails没有复数,这是一个非常明智的推论。
警告:以下示例使用浅嵌套执行此操作:
resources :cats, shallow: true do
resources :noms
end
或那:
resources :cats do
shallow do
resources :noms
end
end
无论如何,如果你设置了一个单一的资源 - address
而不是articles
,那么你会看到类似的东西:
user_address_index GET | POST
new_user_address GET
edit_address GET
address GET | PUT | DELETE
然后正如安德烈亚斯正确地指出的那样,你可能在你的路线中错误地宣布了这一点:
resources :users do
resources :address
end
如果你改为:
resources :users do
resource :address
end
如果你在提示符中点击rake routes
,你应该一切都很好,很开心,看到类似的事情:
user_address POST | GET | PUT | DELETE
new_user_address GET
edit_user_address GET
注意:我知道耙路线的输出看起来并不像这样(它更详细),我只是为了集中注意力而进行简化。
希望有所帮助。