Ruby on Rails路由:具有更多参数的命名空间

时间:2012-11-13 14:44:52

标签: ruby-on-rails ruby namespaces routes

我有一个名称空间“shop”。在该命名空间中,我有一个资源“新闻”。

namespace :shop do
  resources :news  
end

我现在需要的是,我的“新闻”路线可以获得一个新参数:

/shop/nike (landing page -> goes to "news#index", :identifier => "nike")
/shop/adidas (landing page -> goes to "news#index", :identifier => "adidas")
/shop/nike/news
/shop/adidas/news

这样我就可以开店并过滤我的新闻。

我需要一条路线:

/shop/:identfier/:controller/:action/:id

我测试了许多变化,但我无法让它运行。

任何人都可以给我一个提示吗?感谢。

2 个答案:

答案 0 :(得分:4)

您可以使用scope

scope "/shops/:identifier", :as => "shop" do
  resources :news
end

您将获得以下路线:

$ rake routes
shop_news_index GET    /shops/:identifier/news(.:format)          news#index
                POST   /shops/:identifier/news(.:format)          news#create
  new_shop_news GET    /shops/:identifier/news/new(.:format)      news#new
 edit_shop_news GET    /shops/:identifier/news/:id/edit(.:format) news#edit
      shop_news GET    /shops/:identifier/news/:id(.:format)      news#show
                PUT    /shops/:identifier/news/:id(.:format)      news#update
                DELETE /shops/:identifier/news/:id(.:format)      news#destroy

http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing

答案 1 :(得分:3)

如果你在数据库中有那些nike,adidas等,那么最直接的选择是使用匹配。

namespace :shop
  match "/:shop_name" => "news#index"
  match "/:shop_name/news" => "news#news"
end

然而,在我看来,商店应该是你的资源。只需创建一个ShopsController(您不需要匹配的模型,只需要一个控制器)。然后就可以了

resources :shops, :path => "/shop"
  resources :news
end

现在您可以访问新闻索引页面(/ shop / adidas),如下所示:

shop_path("adidas")

在NewsController中使用:shop_id来访问商店的名称(是的,即使它是_id,它也可以是一个字符串)。根据您的设置,您可能希望新闻成为单一资源,或者将新闻方法作为收集方法。

你确定只是重命名新闻资源不是你想要的吗?

resources :news, :path => "/shop" do
  get "news"
end

请记住,控制器名称和控制器数量不一定与您的型号匹配。例如,您可以拥有一个没有NewsController的Ne​​ws模型和一个没有Shop模型的ShopsController。如果有意义,您甚至可以考虑将Shop模型添加到数据库中。 如果这不是您的设置,那么您可能会过度简化您的示例,您应该提供更完整的设置说明。