Rails respond_with - por que o POST retorna um URL em vez dos dados?
Esta é uma pergunta "por que funciona assim" e não "como faço isso funcionar".
Meu aplicativo está chamando uma API REST de terceiros que retorna JSON e retorna o resultado como parte do meupróprio API JSON.
Eu estava usando o Rails 3respond_to
erespond_with
métodos; no caso deGET
solicitações, isso funciona como eu esperava, apenas passando pelo JSON.
No caso dePOST
, faz mais, inclusive fazendo um URL do objeto retornado para passar em um:location
opção. Mas como meu objeto é apenas JSON (não ActiveRecord), recebo um erro.
Por exemplo...
# POST /api/products.json with params id=:id
def create
query_string = "#{user_id}&id=#{params[:id]}"
@products = third_party_api_wrapper.products(query_string, 'POST')
respond_with @products
end
Meu wrapper para a API de terceiros faz uma solicitação POST, que retorna bem, então o Rails retorna um erro 500 que é registrado assim:
NoMethodError (undefined method `{"response":{"message":"product 4e1712d9ec0f257c510013f8 selected"}}_url' for #<MyController>
Rails quer que meu objeto @products saiba como criar um URL de localização.
ESCLARECIMENTO: O@products
objeto retornado pela API de terceiros é puro JSON - uma string, que você pode ver incorporada na mensagem de log de erro acima. Este erro está ocorrendo porque o Rails parece querer que o objeto seja algo mais - no suporte da API interna do Rails, ele é um objeto ActiveRecord.
Se eu substituir o novorespond_with
com sytax com o estilo antigo
respond_to do |format|
format.json { render :json => @products } # note, no :location or :status options
end
então tudo funciona. E é isso que eu fiz, então não tenho um problema de "como", em vez disso, tenho uma pergunta "por que".
Publicação de Ryan Daigle na introdução explica que o que está acontecendo é esperado.
Minha pergunta é:porque fazrespond_with
esperar algo diferente de dados (e o status HTTP?), e aparentemente apenas paraPOST
.
Eu não estou dizendo que é errado, apenasTentando entender a justificativa para a implementação do Rails.