如何根据rails中的提交按钮触发不同的操作

时间:2011-11-24 15:56:51

标签: ruby-on-rails model-view-controller rails-routing

我有一个表单,其中包含一系列内容,以及已有的更新项目的操作。

我想要另一个按钮,点击该按钮会触发不同的操作以删除所选项目。

  = 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'}

This question似乎表明我应该在行动中检查params以找出被点击的内容。但是当我添加更多动作时,我的控制器很快就会变成大量的ifs。

有没有更优雅的方法来做到这一点,即让它只是路由到正确的方法?

感谢您的帮助......

2 个答案:

答案 0 :(得分:3)

这并不适合REST。在REST和Rails中,每个端点通常会有一个操作,而不是根据请求中的某些条件决定端点。

话虽如此,您可以通过检查按下的按钮的名称来根据提交按钮过滤操作。见this SO question

我认为这只适用于你的表单正在做略微不同的事情,比如可能是一个就地更新的提交按钮而不是之后重定向的提交按钮,例如: “更新”与“更新并继续”(设计,但你理解我的意思)。


在评论中解决您的问题,您的方法不必转换为if的长序列。您可以编写一些代码来确定根据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

答案 1 :(得分:0)

我建议你添加一个带有“删除”,“更新”选项的下拉菜单,然后添加一些观察所选项目的jQuery代码,并根据所有项目更改表单的action值,因为你不应该使用一个动作来更新和删除对象!应该有一个更新操作,一个用于删除!