Rails проходит :id с параметрами

Используя помощник rails button_to, я пытаюсь запустить метод update в контроллере. Мне нужно установить идентификатор объекта, который обновляется вручную. Код, который у меня есть, я думаю, должен быть правильным, но рельсы продолжают пытаться поместить идентификатор как часть маршрута.

в представлении:

button_to ">", :controller=>'people', :action=>'update', 'person'=>{:team=>team_leader.team}, :id=>currently_viewing_person

в контроллере:

  def update
    @person = Person.find(params[:id])
    #...rest of method
  end

Метод обновления контроллера никогда не выполняется. Ошибка в веб-браузере:

Unknown action

No action responded to 3. Actions: create, index, new, search, show, and update

«3» было значением currently_viewing_person

Как правильно передать :id, чтобы обновление могло извлечь из params[:id]


person SooDesuNe    schedule 15.07.2010    source источник


Ответы (2)


button_to по умолчанию использует POST. Для обновления вам нужен PUT, поэтому передайте метод вместе с другими параметрами:

button_to ">", 
  { :controller=>'people', :action=>'update',
    'person'=>{:team=>team_leader.team}, 
    :id=>currently_viewing_person }, 
  :method => :put

Обратите внимание, что метод должен быть передан как отдельный хэш.

person zetetic    schedule 15.07.2010

Давайте еще раз прочитаем документацию и поймем, что в архитектуре REST обновление отправляется через PUT, а не POST. Правильный код просмотра:

button_to ">", {:controller=>'people', :action=>'update', 'person'=>{:team=>team_leader.team}, :id=>currently_viewing_person}, :method => :put

Как ни странно, если я просматриваю исходный код на этой странице, форма, созданная button_to, показывает, что используется POST:

<form method="post" ...

Но журнал rails подтверждает, что PUT действительно использовался:

Processing PeopleController#update (for 127.0.0.1 at 2010-07-15 00:10:09) [PUT]
person SooDesuNe    schedule 15.07.2010
comment
Хех, вы опередили меня на секунды :) Причина <form method="post" в том, что браузеры не выполняют PUT (или DELETE), поэтому они эмулируют их с помощью POST. Вы увидите _method =› put или что-то подобное в данных формы. - person zetetic; 15.07.2010