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