Rails 3 has_one路由

cra*_*aig 11 routing has-one ruby-on-rails-3

我有两节课:

class User < ActiveRecord::Base
  :has_one :foo
end

class Foo < ActiveRecord::Base
  :belongs_to :user 
end
Run Code Online (Sandbox Code Playgroud)

Foo是可选的.

我创建了以下路由:

resources :users do
  resources :foo
end
Run Code Online (Sandbox Code Playgroud)

这导致以下路线:

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"}
Run Code Online (Sandbox Code Playgroud)

问题:

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

谢谢你的时间.

Zar*_*ony 27

如果您的模型具有has_one关联,请尝试使用设置路径resource :foo(请注意单数方法名称"resource",而不是"resources").这将设置单例资源路由(例如,没有索引操作,成员操作没有id参数,因为只有一个成员).另请参阅http://apidock.com/rails/ActionController/Resources/resource(2.3文档,但也适用于3.0以及afaik).

  • 不敢相信我错过了. (2认同)