Rails 3 все еще должен работать "_method = PUT"? - PullRequest
2 голосов
/ 17 сентября 2010

Я использую FLEX 3 для выполнения XML-запроса к Rails 3. Поскольку FLEX 3 предлагает только POST и GET, я должен использовать хак "? _Method = PUT" для поддержания правильного RESTfulness:

http://127.0.0.1:3000/locator/locator_users/1.xml?_method=PUT

На стороне сервера он отображается как POST, и я получаю ActionController :: RoutingError (Нет соответствий маршрутов).

Я сделал грабли на маршрутах, и маршрут там, правильно распределен по именам и все. Это хорошо работало с Rails 2, поэтому у меня есть основания полагать, что изменился Rails 3. После некоторого поиска люди, казалось, указали, что он должен все еще работать. Но это не для меня. Кто-нибудь может подтвердить или опровергнуть совместимость с Rails 3?

UPDATE

ОК, после еще нескольких попыток я думаю, что это на самом деле проблема Flash Player 10. Flash PLayer 9, кажется, работает нормально с хакером "_method =", 10 - нет. См. Этот новый пост, который я написал ( Flash Player 9 против Flash Player 10 с FLEX 3,? _Method = PUT / DELETE не работает? ).

Ответы [ 3 ]

4 голосов
/ 29 сентября 2010

Частично это связано с поведением Rack::MethodOverride.Он не проверяет параметры запроса для _method, поэтому вызов http://127.0.0.1:3000/locator/locator_users/1.xml?_method=PUT не будет переопределен должным образом из-за этого.

Я написал часть промежуточного программного обеспечения Rack , которое заменяет егочтобы исправить эту конкретную проблему.

Все, что вам нужно сделать, это добавить ее в Gemfile

gem 'rack-methodoverride-with-params'

поменять Rack :: MethodOverride в config/environment.rb

config.middleware.swap Rack::MethodOverride, Rack::MethodOverrideWithParams
1 голос
/ 09 октября 2013

Если вы можете добавить _method=PUT в тело вашего запроса, то нет необходимости менять промежуточное ПО стойки.

Если вы не можете этого сделать, то я натолкнулся на другое (менее действенное) решение, которое заключается в простом определении пользовательского маршрута, который выполняет то, что вы ищете, например:

# config/routes.rb
post '/locator/locator_users/:id', to: 'locator_users#update', constraints: {_method: 'POST'} # allow http method override

Конечно, вам придется добавлять этот маршрут для каждого ресурса, для которого требуется переопределение метода HTTP, но это может быть полезно, если вы хотите ограничить подверженность потенциальной странности, поскольку это нарушает семантику HTTP.

РЕДАКТИРОВАТЬ: вы можете сделать то же самое с GET-запросами, если вам нужно, просто поменяйте post на get (это может быть полезно, если вам нужна поддержка REST поверх JSONP).

0 голосов
/ 20 апреля 2011

Возможно, вам придется переписать, как вы делаете запрос на сервер. Я использую Rails 3, Flex 4 и Flash 10 вместе (но с приложением, разработанным во Flex 3) и использую _method в качестве параметра в моем HTTPService объекте (оставляя тип контента по умолчанию application/x-www-form-url ).

HTTPService поддерживает только запросы GET и POST. Если вы установите для свойства useProxy значение true в объекте HTTPService, вы можете использовать HEAD, OPTIONS, TRACE и DELETE, но только если вы также используете прокси-службу на основе сервера. Если это не сработает, вы можете попробовать URLLoader или URLRequest или внедрить собственное решение вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...