2010-11-16 2 views
6

У меня есть button_to, что я хочу выполнить действие PUT (есть только одна вещь, которая может быть обновлена ​​об этом ресурсе - она ​​будет обновляться как «признанная», , поэтому нет других полей формы, связанных с запуском действия).Rails3 button_to вызывает действие POST, пытаясь вызвать действие PUT

Это, на мой взгляд (контроллер задается явно, так как кнопка на вид, что принадлежит к другому контроллеру):

<%= button_to "Acknowledged", :controller => 'practice_sessions', :id => @practice_session.id, :method => :put %> 

В моем файле маршрутов, ресурс был объявлен как успокоительной ресурс :

resources :practice_sessions 

Контроллер для этого ресурса имеет действие по созданию и обновлению, а button_to выше вызывает действие create. Я хочу, чтобы он вызывал действие обновления.

Это происходит через бревно прямо перед срабатыванием создают действия:

Started POST "/practice_sessions?id=21&method=put" for 127.0.0.1 at 2010-11-17 08:52:46 +0000 
    Processing by PracticeSessionsController#create as HTML 
    Parameters: {"authenticity_token"=>"1EW0IlI38d0f4wST5azrCEZVZPfih7i0UvCGSF7eqbc=", "id"=>"21", "method"=>"put"} 

ответ

17

Ваш синтаксис немного выключен. button_to принимает три аргумента: заголовок кнопки, хэш-код options и хэш-код html_options. :method=>:put необходимо зайти в html_options, в то время как параметры маршрута должны быть в options. Таким образом, вы можете переписать так:

<%= button_to "Acknowledged", { :controller => 'practice_sessions', 
    :id => @practice_session.id}, 
    :method => :put %> 

При нажатии запрос должен быть обработан PracticeSessionsController#update

+0

Привет, спасибо. Теперь я получаю «Нет маршрутов»/practice_sessions ». Я думаю, это потому, что это PUTting для just/practice_sessions (как видно из URL http: // localhost: 3000/practice_sessions? Id = 26), а не/practice_sessions/26 в этом случае. Я буду продолжать играть с ним, но любые советы оценены! – pakeha

+0

Каков результат «рейк-маршрутов»? – zetetic

+0

Выглядит как ожидалось. Вот строки я представляю себе представляют интерес: practice_session PUT /practice_sessions/:id(.:format) {: действие => "обновление",: контроллер => "practice_sessions"} practice_sessions POST/practice_sessions (. : format) {: action => "create",: controller => "practice_sessions"} – pakeha

1

Вы, возможно, потребуется явно передать :method => :put аргумент в html_options хэш - это может быть получение globbed в options хэш ,

Попробуйте это:

<%= button_to "Acknowledged", { :controller => 'practice_sessions', :id => @practice_session.id }, :method => :put %> 

(Обратите внимание на явные скобки вокруг :controller и :id)

+0

Эй, это не сработало бы для меня (см. Мой ответ на zetetic), но я решил его использовать с помощью именованных маршрутов (см. Мой ответ). Спасибо за ваш вклад, хотя я должен был заметить отдельные аргументы в любом случае. – pakeha

1

В конце концов, я решил пойти с более успокоительным подходом с использованием именованных маршрутов, который, кажется, работает хорошо. Я все еще не уверен на 100%, почему другой метод не работает, но я не думаю, что это важно, потому что это выглядит как a) более аккуратным, так и b) более обычным.

<%= button_to "Acknowledge", practice_session_path(@practice_session), :method => :put %> 
Смежные вопросы