Что лучший способ состоит в том, чтобы обработать динамический content_type в Sinatra

Я в настоящее время делаю следующее, но это чувствует себя "топорным":

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

Моя цель состоит в том, чтобы запланировать заранее. Прямо сейчас мы только работаем с 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
задан lusis 24 May 2010 в 15:06
поделиться

1 ответ

несколько чисток в помощнике:

  • добавление оператора case
  • добавление значения по умолчанию для формата
  • помощник теперь устанавливает тип содержимого

код:

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

здесь я исключил тип содержимого обработки и удалил временную переменную person, поскольку она используется только один раз в пользу использования params. код:

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

Разумно, классно выглядишь?

2
ответ дан 3 September 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: