在Sinatra中处理动态content_type的最佳方法是什么

时间:2010-05-24 15:06:51

标签: ruby sinatra

我目前正在做以下事情,但感觉“kludgy”:

module Sinatra
    module DynFormat
        def dform(data,ct)
            if ct == 'xml';return data.to_xml;end
            if ct == 'json';return data.to_json;end
        end
    end
    helpers DynFormat
end

我的目标是提前计划。现在我们只为这个特定的Web服务使用XML,但是只要我们堆栈中的所有组件都支持它,我们就想转移到JSON。

以下是一个示例路线:

get '/api/people/named/:name/:format' do
    format = params[:format]
    h = {'xml' => 'text/xml','json' => 'application/json'}
    content_type h[format], :charset => 'utf-8'
    person = params[:name]
    salesperson = Salespeople.find(:all, :conditions => ['name LIKE ?', "%#{person}%"])
    "#{dform(salesperson,format)}"
end

感觉就像我没有尽可能地做到这一点。

1 个答案:

答案 0 :(得分:2)

帮手中的一些清理:

  • 添加案例陈述
  • 为格式
  • 添加默认值
  • 帮助程序现在设置内容类型

代码:

module Sinatra
    module DynFormat
        CONTENT_TYPES={'xml' => 'text/xml','json' => 'application/json'}

        def dform(data,format=params[:format])
            content_type CONTENT_TYPES[format], :charset => 'utf-8'
            case format
            when 'xml'
              data.to_xml
            when 'json'
              data.to_json
            end
        end
    end

    helpers DynFormat
end

这里我考虑了内容类型处理,并删除了人物临时变量,因为它仅使用一次以支持使用参数。 代码:

get '/api/people/named/:name/:format' do    
    salesperson = Salespeople.find(:all, :conditions => ['name LIKE ?', "%#{params[:name]}%"])
    dform(salesperson)
end

有道理,看起来很酷吗?