2

假设我有一个Magazine模型和Ad模型,这样Magazine :has_many => :ads. 我已将嵌套资源路由设置如下:

resources :magazines do 
  resources :ads, :shallow => true do
    get 'search', :action => :search, :on => :collection
  end
end

我的目标是能够访问由 Rails 资源创建的默认 CRUD 路由,以及嵌套和浅层的搜索路由。我希望用户能够在给定杂志的上下文中限制他的搜索,或者搜索所有广告而不考虑父杂志,因为有些广告没有父杂志。换句话说,我希望能够:

/magazines/1/ads/new
/ads/new

/magazines/1/ads/search
/ads/search

# ... all standard CRUD routes ...

我担心的是视图中的路径变量依赖于new_magazine_ad_path(@magazine). 在遇到没有任何实例来引导它的助手时,不会访问像/ads/index(应该包含创建新广告的链接)这样的路线吗?new_magazine_ad_path(@magazine)@magazine


PS:通常,我会自己尝试所有这些,看看有什么效果,但我现在被上述设置卡住了——我只能进行编辑、删除、显示和更新浅层路线:

/ads/:id
/ads/:id/edit
/ads/:id (put)
/ads/:id (delete)

并且没有新的或索引路线:

/ads/index
/ads/new

更新

所以 Shreyas 提议创建两个控制器,一个处理嵌套的 Ad,一个处理浅层的 Ad。这是有道理的,但它让我复制所有视图代码只是为了将路径助手从 更改magazine_ad_path(@magazine)ad_path. 关于处理视图更改的 DRY'er 方法的任何想法?所有其他视图代码都是相同的。

4

2 回答 2

2

我希望用户能够在给定杂志的上下文中限制他的搜索,或者搜索所有广告而不考虑父杂志,因为有些广告没有父杂志

您在这里有两个不同的担忧。我建议您针对这两个问题使用两个不同的控制器。当然,其中一个属于杂志上下文,另一个作为独立控制器(没有父杂志的广告)。

这样,您就有了两个不同的控制器,它们的关注点明显分开。

resources :ads do
  get 'search', :action => :search, :on => :collection
end
resources :magazines do 
  resources :ads, :shallow => true do
    get 'search', :action => :search, :on => :collection
  end
end
于 2011-07-30T06:02:46.250 回答
0

您可以使用单个调用来url_for生成任一路由(通过polymorphic_url)。

url_for [:search, @magazine, :ads]
# when @magazine is present, this is equivalent to search_magazine_ads_url
# when @magazine is nil, it's search_ads_url

url_for [:new, @magazine, :ad] #=> new_magazine_ad_url or new_ad_url
url_for [@magazine, :ads] #=> magazine_ads_url or ads_url

您甚至可以将数组传递给link_to由命名助手生成的路由。

link_to 'New Ad', [:new, @magazine, :ad]

http://apidock.com/rails/ActionDispatch/Routing/PolymorphicRoutes

于 2013-12-13T17:12:11.447 回答