Rails response_with - почему POST возвращает URL вместо данных?
Это вопрос «почему это работает так», а не «как мне заставить это работать».
Мое приложение вызывает сторонний REST API, который возвращает JSON, и возвращает результат как часть моегоown JSON API.
Я использовал Rails 3respond_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 хочет, чтобы объект my @products знал, как создать URL-адрес местоположения.
РАЗЪЯСНЕНИЕ:@products
Объектом, возвращаемым сторонним API, является чистый JSON - строка, которую вы можете увидеть в сообщении об ошибке выше. Эта ошибка возникает из-за того, что Rails, кажется, хочет, чтобы объект был чем-то большим - во внутренней поддержке API Rails это объект ActiveRecord.
Если я заменю новыйrespond_with
с синтаксисом в старом стиле
respond_to do |format|
format.json { render :json => @products } # note, no :location or :status options
end
тогда все работает. И это то, что я сделал, поэтому у меня нет «как» проблема, вместо этого есть «почему» вопрос.
Сообщение Райана Дейгла во введении объясняется, что то, что происходит, ожидается.
Мой вопрос:why делаетrespond_with
ожидать ничего, кроме данных (и статуса HTTP?), и, видимо, только дляPOST
.
Я не говорю, что это неправильно, простоtrying to understand обоснование реализации Rails.