Rails 4:具有非标准标识符的嵌套资源



我们来看一下嵌套资源的例子,下面是模型:

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] = 5params[:ad_num] = 1MagazineController => 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 助手很有帮助

最新更新