Tag Archive for '2.3.2'

Flex on, чтоб его, Rails

For those who don’t understand Russian and came here after googling  “ActionController::MethodNotAllowed (Only get, put, and delete requests are allowed.)” scroll down to the very bottom of the page for some English text.

Ruby on Rails развивается такими темпами и такими сложными заковыристыми скачками, что на 2.3.2 код из книги декабря 2008 в мартеапреле 2009 уже не работает. Я это уже испытал конечно на книгах 2006-2007 годов, но все же.

Значит, сама по себе связка Flex + Ruby on Rails очаровательна. Скорость, с которой делаются простые приложения, потрясает. Поэтому я сижу читаю сейчас
Flex on Rails: Building Rich Internet Applications with Adobe Flex 3 and Rails 2 (поделитесь PDFчиком у кого есть). И, как я уже сказал, пробую на себе одни грабли за другими.

Сейчас проблема вот в чем — во Flex HTTPService хоть и говорит, что свойство method = “GET|POST|PUT|DELETE”, но на практике же посылаются только GET и POST запросы (я уверен, 90% пользователей знакомых с понятием GET и POST о том, что есть еще как минимум PUT и DELETE и не подозревают). А рельсам уж очень хочется их использовать, например GET accounts/1 возвращает инфу об акаунте, PUT accounts/1 обновляет акаунт на сервере инфой с клиента, а DELETE accounts/1 удаляет пользователя. В книге об этом написано, надо к URL прибавлять ?_method=put. Но в 2.3.2 это уже не работает. На любые попытки такого обращения получаем.

ActionController::MethodNotAllowed (Only get, put, and delete requests are allowed.)

Гугление показало, что хорошо бы посылать _method=put переменной вместе с основным запросом. Запрос посылается в XML формате, а как известно, флексовый XML не может иметь два корня, тогда как XMLList посылаться отказывается. То есть вариант <_method>put</_method><data /> не проканывает. На оборачивание этого дела в другой тэг Rails ругается.

Продолжение гугления подсказало устанавливать header HTTP_X_HTTP_METHOD_OVERRIDE = PUT. Это не помогло тоже. Тут я расплакался и пошел жаловаться мамепошел перевел Гуглом некоторую китаюскую ссылку вроде бы по теме, где бравый китайский коммунист дошел все же до конца решения этой проблемы. Оказывается, что Rails каким-то макаром приписывал переменным еще один префикс HTTP_, а соответственно на HTTP_HTTP_X_HTTP_METHOD_OVERRIDE = PUT удивленно моргал глазами “а что? это не я!” и ничего не делал.

Так что в итоге работает так:

<mx:HTTPService id=”accountsUpdate”
url=”{CONTEXT_URL}/accounts/{accountsGrid.selectedItem.id}”
method=”POST” resultFormat=”e4x”  contentType=”application/xml” headers=”{{X_HTTP_METHOD_OVERRIDE: ‘PUT’}}” >
</mx:HTTPService>

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

Some English text

Basically, in the recent Rails version adding ?_method=put to URL doesn’t work any more (say hello to those book examples). So, you either have to have a hidden from field named _method (which in case of sending XML with Flex can’t be done) or pass HTTP_X_HTTP_METHOD_OVERRIDE = PUT in request header. But Rails for some reason adds “HTTP_” to variable name, so you need to send X_HTTP_METHOD_OVERRIDE = PUT. The example above shows how to do it.