我正在尝试将路径文件中的路径限制为特定格式。
我想要这个工作:
app.com/party_favors/list.json
不是这个
app.com/party_favors/list
或者这个
app.com/party_favors/list.html
或者这个
app.com/party_favors/list.asdasdasda
有一种简单的方法只允许路由文件中匹配条目中的某种格式吗?
谢谢!
答案 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。我真的希望有一种更清洁的方法来做到这一点。
感谢大家的回答。我很感激。 :)