Flex с Rails, просто хочу обновить запись .... как сложно это может быть? - PullRequest
0 голосов
/ 07 декабря 2009

У меня есть это во Flex:

<mx:HTTPService id="update"
 url="http://localhost:3000/people/{grid.selectedItem.id}.xml?_method=put" 
 contentType="application/xml"
 resultFormat="e4x"
 method="POST"
 result="index.send()"/>

И когда он срабатывает, я получаю следующую ошибку в Rails:

Processing ApplicationController#index (for 127.0.0.1 at 2009-12-07 05:33:55) [POST]
  Parameters: {"person"=>{"first_name"=>"Paul", "last_name"=>"Goulart"}}

ActionController::MethodNotAllowed (Only get, put, and delete requests are allowed.):
  -e:2:in `load'
  -e:2

Если я редактирую ту же запись, используя леса, предоставленные rails, она работает:

Processing PeopleController#update (for 127.0.0.1 at 2009-12-07 05:37:08) [PUT]
  Parameters: {"commit"=>"Update", "authenticity_token"=>"MV9lFxBGxPgqP0WRTqEWa9/8D36ZzX9opk0SzJ3hUjA=", "id"=>"2", "person"=>{"first_name"=>"Paul", "address"=>"San Francisco", "last_name"=>"Goulart"}}
  [4;35;1mPerson Columns (8.0ms)[0m   [0mSHOW FIELDS FROM `people`[0m
  [4;36;1mPerson Load (0.0ms)[0m   [0;1mSELECT * FROM `people` WHERE (`people`.`id` = 2) [0m
  [4;35;1mSQL (0.0ms)[0m   [0mBEGIN[0m
  [4;36;1mPerson Update (0.0ms)[0m   [0;1mUPDATE `people` SET `first_name` = 'Paul', `updated_at` = '2009-12-07 13:37:08' WHERE `id` = 2[0m
  [4;35;1mSQL (1.0ms)[0m   [0mCOMMIT[0m

Это должно быть легко. Просто пытаюсь обновить данные из flex используя xml.

Я застрял. Кто-нибудь может помочь?

Спасибо.

Пол

Ответы [ 3 ]

0 голосов
/ 07 декабря 2009

Only get, put, and delete requests are allowed.

изменить method="POST" на method="PUT" или method="GET"

<mx:HTTPService id="update"
 url="http://localhost:3000/people/{grid.selectedItem.id}.xml?_method=put" 
 contentType="application/xml"
 resultFormat="e4x"
 method="GET"
 result="index.send()"/>

HTTPService поддерживает GET, POST, HEAD, OPTIONS, PUT, TRACE и DELETE.

0 голосов
/ 08 декабря 2009

Хорошо, наконец-то выяснили, как сделать RESTful CRUD во Flex с Ruby on Rails. Спасибо всем, кто откликнулся. Я изучал книгу Flex on Rails Тони Хиллерсона и Дэниела Ванджа. Каким-то образом я не мог заставить его работать. Удаление не работало, потому что в их примере у них было удаление, и мой метод назывался уничтожить. В любом случае, это хорошая книга, и я подумал, что поделюсь, как я нашел решение, которое работает. Оказывается, это было просто добавление соглашения об обновлении или уничтожении в тегах HTTPService.

Создание лесов для учетной записи

скрипт / сгенерировать скаффолд Имя учетной записи: строка (Возможно, вам придется сделать db: create или db: migrate)

Контроллер учетных записей выглядит следующим образом:

класс AccountsController @accounts конец

def create @account = Account.new (params [: account]) if @ account.save render: xml => @account,: status =>: созданный,: location => @account еще render: xml => @ account.errors,: status =>: unprocessable_entity конец конец

обновление по умолчанию @account = Account.find (params [: id]) if @ account.update_attributes (params [: account]) голова: хорошо еще render: xml => @ account.errors,: status =>: unprocessable_entity конец конец

# УДАЛИТЬ / account / 1 # DELETE /accounts/1.xml Def Destroy @account = Account.find (params [: id]) @ account.destroy голова: хорошо конец конец

Routes.rb выглядит так:

ActionController :: Routing :: Routes.draw do | map | map.resources: account map.connect 'account /: id',: controller => 'accounts',: action => 'update' # Приоритет зависит от порядка создания: сначала создан -> самый высокий приоритет.

# Пример регулярного маршрута: # map.connect 'products /: id',: controller => 'catalog',: action => 'view' # Помните, что вы можете назначать значения, отличные от: controller и: action

# Пример названного маршрута: # map.purchase 'products /: id / purchase',: controller => 'catalog',: action => 'purchase' # Этот маршрут может быть вызван с помощью purchase_url (: id => product.id)

# Пример маршрута ресурса (автоматически сопоставляет глаголы HTTP с действиями контроллера): # map.resources: products

# Пример маршрута ресурса с параметрами: # map.resources: products,: member => {: short =>: get,: toggle =>: post},: collection => {: sold =>: get}

# Пример маршрута ресурса с подресурсами: # map.resources: products,: has_many => [: комментарии,: продажи],: has_one =>: продавец

# Пример маршрута ресурса с более сложными подресурсами # map.resources: продукты делают | продукты | # products.resources: комментарии # products.resources: sales,: collection => {: недавний =>: получить} # end

# Пример маршрута ресурса в пространстве имен: # map.namespace: admin do | admin | # # Направляет / admin / products / * на Admin :: ProductsController (app / controllers / admin / products_controller.rb) # admin.resources: продукты # end

# Вы можете направить корень своего сайта с помощью map.root - не забудьте удалить public / index.html. # map.root: controller => "welcome"

# Посмотрите, как все ваши маршруты расположены с помощью "граблей маршрутов"

# Установить маршруты по умолчанию как самый низкий приоритет. # Примечание: эти маршруты по умолчанию делают все действия в каждом контроллере доступными через запросы GET. Вам следует # рассмотрите возможность удаления или комментирования их, если вы используете именованные маршруты и ресурсы. map.connect ': controller /: action /: id' map.connect ': controller /: action /: id.: format' конец

Файл mxml выглядит следующим образом:

    private const CONTEXT_URL:String = "http://localhost:3000";

    private function addNewAccount():void {
        accounts.appendChild(<account><id></id><name>new name</name></account>);
    }


]]>
</mx:Script>

<mx:HTTPService id="accountsIndex" url="{CONTEXT_URL}/accounts"
    resultFormat="e4x"
    result="accounts=event.result as XML" />

<mx:HTTPService id="accountsCreate" url="{CONTEXT_URL}/accounts"
    method="POST" resultFormat="e4x" contentType="application/xml"
    result="accountsIndex.send()" />

<mx:HTTPService id="accountsUpdate"
    url="{CONTEXT_URL}/accounts/{accountsGrid.selectedItem.id}?_method=put"
    method="POST" resultFormat="e4x" contentType="application/xml" />

<mx:HTTPService id="accountsDelete"
    url="{CONTEXT_URL}/accounts/destroy/{accountsGrid.selectedItem.id}"
    method="POST" resultFormat="e4x" contentType="application/xml"
    result="accountsIndex.send()" >
    <mx:request>
        <_method>
            destroy
        </_method>
    </mx:request>
</mx:HTTPService>   

<mx:DataGrid id="accountsGrid"
    dataProvider="{accounts.account}"
    editable="true">
    <mx:columns>
        <mx:DataGridColumn headerText="Id" dataField="id" editable="false"/>
        <mx:DataGridColumn headerText="Name" dataField="name" />
    </mx:columns>
</mx:DataGrid>

<mx:Button label="New"
    click="addNewAccount()"
    enabled="{accountsGrid.dataProvider!=null}" />

<mx:Button label="{accountsGrid.selectedItem.id==''?'Create':'Update'}"
    click="accountsGrid.selectedItem.id=='' ?
        accountsCreate.send(accountsGrid.selectedItem) :
        accountsUpdate.send(accountsGrid.selectedItem)" />

<mx:Button label="Delete"
    click="accountsGrid.selectedItem.id=='' ?
        accountsIndex.send() : accountsDelete.send()"
    enabled="{accountsGrid.selectedItem!=null}" />                  

0 голосов
/ 07 декабря 2009

Я думаю, вам нужно опубликовать параметр _method. Он не принимает _GET для параметра метода и возвращает, что для этого маршрута разрешены только запросы GET, PUT и DELETE.

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