Как вызвать различные действия на основе кнопки отправки в рельсах - PullRequest
4 голосов
/ 24 ноября 2011

У меня есть форма со списком вещей, и уже есть действие для обновления элементов.

Мне нужна еще одна кнопка, которая при нажатии запускает другое действие для удаления выбранных элементов.

  = form_for @new_item,:url => {:controller => "item_lists",:action => "update_list" } do |f|
     - @items.each do |it|
    %input{:type=>"hidden",:name=>"item_list[#{it.id}]position",:value=>it.position, :class=>'position'}
    %textarea{:name=>"item_list[#{it.id}]field1"}
      =it.field1
    %textarea{:name=>"item_list[#{it.id}]field2"}
      =it.field2
    %input{:type=>'checkbox', :name=>'selected_items[]', :value=>it.id}
    =(it.valid?) ? "" : it.errors.full_messages




    %input{:type=>"submit", :value=>"Save changes", :name=>'save'}
    %input{:type=>"submit", :value=>"Remove selected", :name=>'delete'}

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

Есть ли более элегантный способ сделать это, то есть заставить его просто перенаправить на правильный метод?

Спасибо за любую помощь ...

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Это действительно не гель с REST.В REST и Rails вы обычно будете иметь по одному действию на конечную точку, а не выбирать конечную точку на основе некоторых критериев в запросе.

При этом можно фильтровать действия на основе кнопки отправки, проверяяназвание кнопки нажата.См. этот ТАК вопрос .

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


Если учесть вашу озабоченность в комментариях, ваш метод не должен будет превращаться в длинную последовательность if s.Вы можете просто написать некоторый код, чтобы определить, какой метод вызывать, основываясь на имени кнопки submit.Простая реализация может быть:

# your form action
def update_list
  send update_list_action
end

protected

def update_list_action
  # just return the first action name found in the params
  action = %w(save delete).detect {|action| params[action] }
  "update_list_#{action}"
end

def update_list_save
  # handle save
end

def update_list_delete
  # handle delete
end
0 голосов
/ 24 ноября 2011

Я бы предложил вам добавить выпадающее меню с опцией «удалить», «обновить», ... и добавить некоторый код jQuery, который наблюдает за выбранным элементом и изменяет action вашей формы в зависимости от значения, потому что Вы не должны использовать одно действие для обновления и удаления объектов! Должно быть одно действие для обновления и одно для удаления!

...