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.

Ответы на вопрос(3)

Ваш ответ на вопрос