Это вопрос «почему это работает именно так», а не «как мне заставить это работать».
Мое приложение вызывает сторонний REST API, который возвращает JSON и возвращает результат как часть моего собственногоJSON API.
Я использовал методы Rails 3 response_to
и response_with
; в случае запросов GET
это работает, как я и ожидал, просто передавая JSON.
В случае POST
он делает больше, включая создание URL-адреса из объекта, возвращенного для передачи в опции :location
. Но так как мой объект просто JSON (не ActiveRecord), я получаю сообщение об ошибке.
Например...
# 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
Моя оболочка для стороннего API делает запрос POST, который возвращается нормально, затем Rails возвращает ошибку 500, которая регистрируется следующим образом:
NoMethodError (undefined method `{"response":{"message":"product 4e1712d9ec0f257c510013f8 selected"}}_url' for #
Rails хочет, чтобы мой объект @products был знать, как сделать URL-адрес местоположения.
ПОЯСНЕНИЕ: объект @products
, возвращаемый сторонним API, представляет собой чистый JSON — строку, которую вы можете видеть встроенной в сообщение журнала ошибок выше. Эта ошибка возникает из-за того, что Rails, кажется, хочет, чтобы объект был чем-то большим — во внутренней поддержке API Rails это объект ActiveRecord.
Если я заменю новый синтаксис response_with
на старый
respond_to do |format|
format.json { render :json => @products } # note, no :location or :status options
end
, то все заработает.И это то, что я сделал, поэтому у меня нет проблемы «как», вместо этого у меня есть вопрос «почему».
В сообщении Райана Дейглао вступлении объясняется, что происходящее ожидаемо.
Мой вопрос: почемуresponse_with
ожидает чего-то другого, кроме данных (и статуса HTTP?), и, по-видимому, только для POST
.
Я не говорю, что это неправильно, просто пытаюсь понятьобоснование реализации Rails.