Rails 3 has_one路由

时间:2010-07-27 17:16:54

标签: routing ruby-on-rails-3 has-one

我有两个班级:

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"}

问题:

  1. 看起来Index和Show操作是多余的。是否应该删除其中一个?如果是这样,哪一个?
  2. Show动作中的:id参数似乎没必要,因为user_id是foos表中的外键,每个用户只有一个foo。我错了吗?
  3. 如果没有foo,我想有一种优雅的方式来路由到New动作。一种选择是测试@ user.foo.nil?在FooController的Show或Index操作中,然后重定向到New操作。还有更好的方法吗?
  4. 感谢您的时间。

2 个答案:

答案 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

注意:我知道耙路线的输出看起来并不像这样(它更详细),我只是为了集中注意力而进行简化。

希望有所帮助。