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

Ruby on rails 如何根据rails中的提交按钮触发不同的操作,ruby-on-rails,model-view-controller,rails-routing,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

我有一个表单,上面有一个物品列表,还有一个更新物品的操作

我想要另一个按钮,当点击它时会触发一个不同的动作来删除所选的项目

  = 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

有没有一种更优雅的方法可以做到这一点,也就是说,让它直接路由到正确的方法


感谢您的帮助……

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

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

也就是说,您可以通过检查按下的按钮的名称来根据submit按钮过滤操作。看

但我认为,只有当您的表单做的事情稍有不同时,这才是合适的,比如可能是一个就地更新的提交按钮,而不是一个事后重定向的提交按钮,例如“更新”和“更新并继续”(人为的,但您明白我的意思)


在评论中解决您的问题,您的方法不必退化为一长串
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

真正地这似乎也有点骇人听闻,没有javascript就无法做到这一点?一个动作是更新列表中的项目,另一个动作是删除列表中的项目。“REST”方法将强制用户点击以单独编辑/删除每个项目,但我担心这将是一个糟糕的用户体验……这不是rails的问题,而是一个一般的HTML问题。提交按钮只需提交表单。有多种方法可以绕过这一限制来隐藏这一限制,但它们都是黑客(幕后JS或依赖于按钮点击事件)、麻烦(例如,通过子操作的选择框),在JavaSpring中,您只需在控制器中注释您的方法,即使在发布到同一url时,它也会根据提交参数调用正确的方法。我很惊讶rails没有提供类似的功能,因为表单上的不同按钮在控制器上执行不同的操作似乎是很常见的事情。rails可能没有提供类似的功能,因为a.)它面向REST,而REST不支持这种功能;B.)您可以自己做这件事,不会有太多麻烦。查看我的答案编辑。谢谢你的帮助,看起来不像我想象的那么邪恶。我仍然认为路由器原则上应该能够做到这一点。REST对于API和服务来说是非常好的,但我认为REST原则不应该决定最终用户的体验。