加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:16:32 所属栏目:百科 来源:网络整理
导读:我有一个包含东西列表的表单,以及已经有更新项目的操作. 我想要另一个按钮,单击该按钮会触发不同的操作以删除所选项目. = form_for @new_item,:url = {:controller = "item_lists",:action = "update_list" } do |f| - @items.each do |it| %input{:type="hi
我有一个包含东西列表的表单,以及已经有更新项目的操作.

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

= 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.

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

谢谢你的帮助…

解决方法

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

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

我认为,只有当你的表单做的事情略有不同时才会这样做,比如可能是一个就地更新的提交按钮而不是之后重定向的提交按钮,例如: “更新”与“更新并继续”(做作,但你理解我的意思).

在评论中解决您的问题,您的方法不必转换为长序列的ifs.您可以编写一些代码来根据提交按钮的名称确定要调用的方法.一个简单的实现可能是:

# 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读