Rails 3 и JSON: рендерер по умолчанию, но пользовательский тип MIME - PullRequest
8 голосов
/ 02 января 2012

Использование ROAR (https://github.com/apotonick/roar) и без использования ActiveRecord или каких-либо шаблонов представления, которые я хочу:

  • используйте по умолчанию JSON rederer, но мой собственный MIME-тип для рендеринга JSON с response_with
  • используйте синтаксический анализатор JSON по умолчанию *1013*, но мой собственный тип MIME для помещения записей тела POST в хэш params.

конфиг / Инициализаторы / mime_types.rb:

Mime::Type.register "application/vnd.xxx-v1+json" , :xxx_v1

Контроллеры / апи / base_controller.rb

class Api::V1::BaseController < ActionController::Base
  respond_to :xxx_v1

  ActionController.add_renderer :xxx_v1 do |obj, options|
    json = obj.to_json
    self.content_type ||= Mime::Type.lookup('application/vnd.xxx-v1+json')
    self.response_body  = json
  end
end

Контроллеры / апи / user_controller.rb:

class Api::V1::UsersController < Api::V1::BaseController 

  def index
    respond_with User.all
  end
end

GET http://domain/users Принять заявку / vnd.xxx-v1

ОШИБКА: отсутствует шаблон api / v1 / users / index, api / v1 / base / index с {: handlers => [: erb,: builder],: format => [: xxx_v1],: locale => [ : en,: en]}

После прочтения нескольких постов вроде Rails Custom Renderer или rails 3 формат ответа и управление версиями с использованием MIME-типа поставщика в заголовке Accept Я все еще не могу заставить его работать ..

- === небольшое обновление === -

Когда я использую рендер прямо в контроллере, он работает! Всегда проблемы с response_with ...

render :xxx_v1 => User.all

Ответы [ 2 ]

4 голосов
/ 05 января 2012

Для автоматического разбора http-тел с пользовательскими типами MIME выполните: config / initializers / mime_types.rb :

ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup('application/vnd.xxx_v1+json')]=lambda do |body|
  JSON.parse(body)
end
3 голосов
/ 06 марта 2012

Решение для рендеринга:

Поместите пустой метод в ваши модели:

def to_xxx_v1
end

Он не вызывается, но должен присутствовать для response_with.

...