【问题标题】:Sinatra App JSON and RoutesSinatra 应用程序 JSON 和路由
【发布时间】:2012-07-14 21:44:04
【问题描述】:

场景
我有一个 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/:today.json" 而不是"/frontpage/:type",是否可以保留这条路线"/frontpage/:type" 并显示.json 页面?

专门为 JSON 请求创建单独的路由会更好吗?

【问题讨论】:

    标签: ruby json activerecord routes sinatra


    【解决方案1】:

    route order 很重要。

    比较这个应用程序,首先是.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
    

    【讨论】:

      【解决方案2】:

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

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

      你可以使用 ext var 来返回你的 json 内容,如果它是非空的,并且有值 'json'。

      【讨论】:

        【解决方案3】:

        您必须创建一条新路线。

        不过,您可以像这样考虑代码:

        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
        

        【讨论】:

        • 这是一个很好的例子。我一直认为这将是一种方法。从来没有考虑过这样分手。
        猜你喜欢
        • 1970-01-01
        • 2017-06-03
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 2014-05-23
        • 1970-01-01
        • 2014-01-13
        • 1970-01-01
        相关资源
        最近更新 更多