Rails response_with — почему POST возвращает URL вместо данных?

Это вопрос «почему это работает именно так», а не «как мне заставить это работать».

Мое приложение вызывает сторонний 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.

17
задан Tom Harrison 20 June 2012 в 22:36
поделиться