Routing Rails 3有一个路由

Routing Rails 3有一个路由,routing,ruby-on-rails-3,has-one,Routing,Ruby On Rails 3,Has One,我有两门课: class User < ActiveRecord::Base :has_one :foo end class Foo < ActiveRecord::Base :belongs_to :user end 这将导致以下路线: GET /users/:user_id/foo(.:format) {:controller=>"foos", :action=>"index"} user_foos POST /use

我有两门课:

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

class Foo < ActiveRecord::Base
  :belongs_to :user 
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"}
问题:

  • 似乎索引和显示操作是多余的。应该移除其中一个吗?如果是,哪一个
  • Show操作中的:id参数似乎没有必要,因为user_id是foos表中的外键,并且每个用户只有一个foo。我弄错了吗
  • 如果没有foo,我希望有一种优雅的方式来引导新动作。一个选项是测试@user.foo.nil?在FooController的Show或Index操作中,然后重定向到新操作。有更好的办法吗

  • 谢谢您的时间。

    如果您的模型有一个has\u one关联,请尝试使用
    资源:foo
    设置路由(请注意单数方法名称“resource”,而不是“resources”)。这将设置单例资源路由(例如,没有索引操作,成员操作没有id参数,因为只有一个成员)。另请参见(2.3文档,但也适用于3.0以及afaik)。

    我可以理解为什么Craig实际上忽略了这一点。这是如此微妙的差别,我甚至没有想到。唯一让我感到意外的是,我为单例资源命名的路由有一个奇怪的索引名:
    user\u foo\u index
    ,而不是
    user\u foos

    这是一个非常聪明的推论,因为Rails没有复数

    警告:以下示例使用浅嵌套,方法如下:

    resources :cats, shallow: true do
      resources :noms
    end
    
    或者:

    resources :cats do
      shallow do
        resources :noms
      end
    end
    
    无论如何,回到正题,如果你设置了一个单一的资源-
    地址
    ,而不是
    文章
    ,你会看到这样的情况:

    user_address_index GET | POST
      new_user_address GET
          edit_address GET
               address GET | PUT | DELETE
    
    然后,正如Andreas公正地指出的,您可能在路线中错误地声明了这一点:

    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
    
    注意:我知道rakes routes的输出看起来并不完全像这样(更详细),我只是为了集中精力而简化


    希望能有帮助。

    真不敢相信我错过了。
         user_address POST | GET | PUT | DELETE
     new_user_address GET
    edit_user_address GET