0

场景
我有一个 Sinatra 应用程序
我有一个基于某个命名路径获取文章的路由

# 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 请求创建单独的路由会更好吗?

4

3 回答 3

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
于 2012-07-16T15:32:08.343 回答
1

这实际上可以通过一条路线完成:

require 'rubygems'
require 'sinatra'

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

您可以使用 ext var 返回您的 json 内容,如果它不是 nill 并且具有值“json”。

于 2012-07-19T04:11:59.823 回答
0

路线顺序很重要。

比较这个应用程序,.json 首先

require "sinatra"
require "sinatra/contrib/all"

get "/greet/:name.json" do |name|
  json ({"greeting" => greeting(name)})
end

get "/greet/:name" do |name|
  greeting name
end

def greeting(name)
  "Hello #{name}"
end

有了这个应用程序,.json 最后

require "sinatra"
require "sinatra/contrib/all"

get "/greet/:name" do |name|
  greeting name
end

get "/greet/:name.json" do |name|
  json ({"greeting" => greeting(name)})
end

def greeting(name)
  "Hello #{name}"
end

与第一个:

$ curl localhost:4567/greet/frank
Hello frank

$ curl localhost:4567/greet/frank.json
{"greeting": "Hello frank"}

但有了第二个,

$ curl localhost:4567/greet/frank
Hello frank

$ curl localhost:4567/greet/frank.json
Hello frank.json
于 2018-10-28T14:41:58.867 回答