Это вопрос "почему он работает таким образом", а не "как мне это сделать".
Мое приложение вызывает сторонний 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
Моя обертка для стороннего 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
тогда все работает. И это то, что я сделал, поэтому у меня нет проблемы с "как", вместо этого возникает вопрос "почему".
Сообщение Райана Дайгла о введении объясняет, что ожидается.
Мой вопрос: почему выполняет respond_with
ожидание чего-либо, кроме данных (и статуса HTTP?), и, по-видимому, только для POST
.
Я не говорю, что это неправильно, просто пытается понять обоснование реализации Rails.