Rails 3路由和格式特异性

时间:2010-11-17 11:53:36

标签: ruby-on-rails ruby routes

我正在尝试将路径文件中的路径限制为特定格式。

我想要这个工作: app.com/party_favors/list.json

不是这个

app.com/party_favors/list或者这个 app.com/party_favors/list.html或者这个 app.com/party_favors/list.asdasdasda

有一种简单的方法只允许路由文件中匹配条目中的某种格式吗?

谢谢!

6 个答案:

答案 0 :(得分:11)

Rails 3提供了可以在路由上指定的:constraints option。这可以将相同的URL路由到不同的控制器,具体取决于格式:

# http://app.com/party_favors.html gets routed to Web::PartyFavorsController#index
resources :party_favors, :module => "web", :constraints => {:format => :html}

# http://app.com/party_favors.xml gets routed to PartyFavorsController#index
resources :party_favors

我在Rails 2中尝试了:requirements选项,但它看起来并不灵活。我不知道有任何方法可以将它构建到Rails 2的路由中,所以你必须使用其他一个建议。

答案 1 :(得分:4)

如果要将这些路由限制为特定格式(例如html或json),则必须将这些路由包装在作用域中。遗憾的是,在这种情况下,约束条件无法正常工作。

这是一个这样的块的例子......

scope :format => true, :constraints => { :format => 'json' } do
  get '/bar' => "bar#index_with_json"
end

可在此处找到更多信息:https://github.com/rails/rails/issues/5548

这个答案是从我之前的答案复制而来的。

Rails Routes - Limiting the available formats for a resource

答案 2 :(得分:3)

你可以像这样明确地映射它

match 'party_favors/list.json', :controller => 'party_favors', :action => 'list', :format => 'json'

答案 3 :(得分:2)

我发现以下内容适用于我(Rails 3.1.1)

match '/categories/:id.json'=>'categories#show', :format=>false, :defaults=>{:format=>'json'}

答案 4 :(得分:1)

据我所知,你可以在控制器而不是路由中处理这个问题

 respond_to do |format|
  format.html
  format.json { render :json => @abcd }
  format.any { render :text => "Invalid format", :status => 403 }
end

答案 5 :(得分:0)

我最终使用这个解决方案来解决我公开的两种暴露方法。 before filter option因为它给出了404s。我真的希望有一种更清洁的方法来做到这一点。

感谢大家的回答。我很感激。 :)