Pergunta

Aplicação A Rails com uma interface RESTful precisa aceitar dados POST usando um tipo MIME personalizado com base em 'application / json'. Vamos chamada que tipo MIME 'application / vnd.com.example.Foo + json'.

Registrando o tipo MIME personalizado no Rails usando Mime :: Type.register funciona bem em que o aplicativo reconhece o tipo MIME dada em "Aceitar". Cabeçalho e processa uma vista JSON através respond_to

O problema é com métodos do controlador, como atualizar e criar essa necessidade de dados formatados convertido costume JSON em um hash params. Se eu definir o "Tipo de Conteúdo:". Cabeçalho para application / json, os dados são analisados ??para o hash de parâmetros

Mas se eu definir o "Tipo de Conteúdo:". Cabeçalho para 'applcation / vnd.com.example.Foo + json', então a carga útil não ter analisado

Assim, parece que MIME :: Type.register é utilizado para accionar o bloco respond_to, mas não para decidir como analisar cargas úteis para criar e métodos de atualização.

Todas as idéias?

Foi útil?

Solução

Para aqueles que possam estar interessados, eu encontrei a resposta à minha pergunta.

Use algo como isso em mime_types.rb (ou possivelmente em outros lugares em sua sua seqüência de inicialização):

ActionController::Base.param_parsers[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body|
  JSON.parse body
end

Um problema: não utilize maiúsculas no tipo MIME acima (isto é, 'aplicação / vnd.com.example.Foo + json'). Trilhos converte o tipo de MIME em todas as letras minúsculas, de forma que nenhum jogo será encontrado que ele é definido como maiúsculas.

Outras dicas

Em Rails 3 fazer:

ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body|
  JSON.parse(body)
end

Em Rails 5 fazer:

ActionDispatch::Request.parameter_parsers[Mime::Type.lookup('application/vnd.api+json').symbol] = lambda do |body|
  JSON.parse(body)
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top