2012-07-16 72 views
0

方案
我有一個西納特拉應用
我有一個基於一定的命名路徑西納特拉應用JSON和路線

# Get Articles for a certain time period 

get '/frontpage/:type' do 
    case params[:type] 

    when "today" 
     @news = Article.find(...) 
    when "yesterday" 
     @news = Article.find(...) 
    when "week-ago" 
     @news = Article.find(...) 
    when "month-ago" 
     @news = Article.find(...) 
     else 
     not_found 
    end 

    erb :frontpage 

end 

問題
上取物品的路線是否有可能保持這條路線"/frontpage/:type",並顯示一個.json頁面,如果有人要求"/frontpage/:today.json"而不是"/frontpage/:type"

是否更好地爲JSON請求創建單獨的路由?

回答

1

您將不得不創建一條新路線。

雖然,那麼您可以您的代碼這樣的:

get '/frontpage/:type' do 
    @news = get_articles(params[:type]) 
    erb :frontpage 
end 

get '/frontpage/:type.json' do 
    get_articles(params[:type]).json 
end 

def get_articles(type) 
    case 
    when "today" 
    Article.find(...) 
    when "yesterday" 
    Article.find(...) 
    when "week-ago" 
    Article.find(...) 
    when "month-ago" 
    Article.find(...) 
    else 
    raise "Unsupported type #{type}. Supported types are: today, yesterday, week-ago and month-ago." 
    end 
end 
+0

這是一個很好的例子。我一直認爲這將是一種方法。從來沒有考慮過像這樣分手。 – alenm 2012-07-16 20:13:33

1

這其實可以用一個單一的途徑來完成:

require 'rubygems' 
require 'sinatra' 

get %r{/frontpage/([^\.]+)\.?(.+)?} do |type, ext| 
    'the type is: ' + type + ' and the extension is: ' + "#{ext}" 
end 

您可以使用分機VAR來回報您的JSON內容如果它是非空的,並且值爲'json'。