Chr*_*ris 5 model-view-controller ruby-on-rails 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'}
Run Code Online (Sandbox Code Playgroud)
这个问题似乎表明我应该检查我的操作中的参数以找出单击的内容。但这感觉很混乱,当我添加更多操作时,我的控制器可能很快就会退化为大量的 if。
有没有更优雅的方法来做到这一点,即让它只路由到正确的方法?
谢谢你的帮助...
这与 REST 并不能真正融为一体。在 REST 和 Rails 中,您通常会对每个端点执行一个操作,而不是根据请求中的某些条件来决定端点。
话虽这么说,您可以通过检查按下的按钮的名称来根据提交按钮过滤操作。看到这个SO问题。
但我认为,只有当您的表单执行稍微不同的操作时,这才是合适的,例如可能是就地更新的提交按钮与随后重定向到某处的提交按钮,例如“更新”与“更新并继续”(人为的,但你明白我的意思)。
在评论中解决您的担忧,您的方法不必演变为一长串ifs. 您可以编写一些代码来根据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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4578 次 |
| 最近记录: |