我们来看一下嵌套资源的例子,下面是模型:
class Magazine < ActiveRecord::Base
has_many :ads, :order => 'time_start'
end
class Ad < ActiveRecord::Base
belongs_to :magazine
end
到目前为止,路由如下所示:
resources :magazines do
resources :ads
end
这会自动生成类似 /magazines/:magazine_id/ads/:id
的 URL。
但是,我希望有稍微不同的URL方案,更加以"杂志"为中心。一般嵌套 URL 方案应如下所示:/magazines/:id/:ad_num/component
,其中:
- ":
- id"是标准生成的路由URL中的":magazine_id",是数据库中杂志对象的主键
- ":ad_num"是一种识别给定杂志内单个广告的方法,但它不是数据库标识符,而是单个杂志中广告数组中的索引
- 不应该有通用的"显示"操作(即
/magazines/:id/:ad_num
),但"广告"中有多个组件,这些组件使用几种不同的操作显示
我根本不想AdsController
,所有这些路由都应该指向MagazineController
中的各种操作,例如magazines/5/1/title
应该指向带有 params[:id] = 5
和 params[:ad_num] = 1
的 MagazineController
=> title
.
当然,像title_ad_magazine(@magazine, @ad)
这样有用的 URL 帮助程序将是最有帮助的。
如何在新的 Rails 路由 DSL 中执行此操作?
您可以使用这些参数键生成自定义路由,如下所示
get '/magazines/:id/:ad_num/title' => 'magazine#title', as: :magazine_ads_title
您将parmams[:id]
和params[:ad_num]
与URL的这些部分匹配
您不需要使用 as: 选项,但您可能会发现生成我的直观 url 助手很有帮助