Ruby on Rails嵌套具有has_one关联的路由

时间:2014-05-07 05:48:10

标签: ruby-on-rails ruby ruby-on-rails-4 routes

我有两种模式:

预留:

class Reservation < ActiveRecord::Base
  has_one :car_emission
end

CarEmission:

class CarEmission < ActiveRecord::Base
  belongs_to :reservation
end

以及以下路线:

resources :reservations do 
  resources :car_emissions
end

现在,当我想要创建新的car_emission时,我必须访问这样的URL:

http://localhost:3000/reservations/1/car_emissions/new

当我想编辑时,我必须访问:

http://localhost:3000/reservations/1/car_emissions/1/edit

无论如何要改变我的car_emission编辑链接的路线如下:

http://localhost:3000/reservations/1/car_emission

4 个答案:

答案 0 :(得分:4)

你想做几件事:

1. Create singular resource
2. Change the `edit` path for your controller

Singular Resource

根据@sreekanthGS的建议,您首先要创建一个独特的资源。这与resources方法的工作方式相同,只是它将您的路线视为单个记录;取消index路线等:

#config/routes.rb
resources :reservations do
    resource :car_emission # -> localhost:3000/reservations/1/car_emission
end

修改

这将为您的car_emission创建一组RESTful路由,但当您点击“裸”链接时,它仍会转到car_emissions#show行为

你最好这样做:

#config/routes.rb
resources :reservations do
    resource :car_emission, except: :show, path_names: { edit: "" }
end

当您点击“裸露”链接

时,会转到edit行动

答案 1 :(得分:2)

尝试:

resources :reservations do 
  resource :car_emissions
end

有一种叫做奇异资源的东西:

  

http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default

<强> 引用:

部分: 2.5奇异资源

有时,您拥有一个客户端始终查找而不引用ID的资源。例如,您希望/ profile始终显示当前登录用户的配置文件。在这种情况下,您可以使用单一资源将show / profile(而不是/ profile /:id)映射到show动作:

get 'profile', to: 'users#show'

传递一个String来获取将需要一个控制器#动作格式,而传递一个符号将直接映射到一个动作:

get 'profile', to: :show

这条资源丰富的路线:

resource :geocoder

在您的应用程序中创建六个不同的路径,所有路径都映射到Geocoders控制器。

答案 2 :(得分:1)

shallow: true可能就是您想要的

resources :reservations, shallow: true do 
  resources :car_emissions
end

shallow: true会在index内嵌入create new:car_emissions:reservations次行动。 update动作不会嵌套在里面。

这将为您提供如下所示的路线:

GET  /reservations/:reservation_id/car_emissions(.:format)   caremissions#index
POST     /reservations/:reservation_id/car_emissions(.:format)   caremissions#create
GET  /reservations/:reservation_id/car_emission/new(.:format) caremissions#new

GET  /reservations/:id/edit(.:format)    reservations#edit
PATCH    /reservations/:id(.:format)     reservations#update
PUT  /reservations/:id(.:format)     reservations#update
DELETE   /reservations/:id(.:format)     reservations#destroy
GET  /reservations/:id(.:format)     reservations#show

答案 3 :(得分:1)

此类型的链接

http://localhost:3000/reservations/1/car_emission

用于显示宁静资源的汽车排放量,因此使用它进行简单编辑就像上面使用的那样可能会与宁静的资源冲突。

您可以选择制作单独的奇异资源,并将其指向您想要的路线。