就像我们的邮件列表一样,在表格的每行记录前面都有一个复选框,我们可以选择多条记录后,点“删除”按钮,一次删掉多条记录。请问在rails里如何实现这种操作呢?
哦,我在一楼说的,对于在rails麻烦了,因为rails中已经有很方便的做法了
[code="java"]
def complete
Task.delete([color=red]params[:ids][/color])
end
<% form_tag complete_tasks_path do %>
真是太方便了,
[code="ruby"] # Delete a single object
Todo.delete(1)
# Delete multiple objects
todos = [1,2,3]
Todo.delete(todos)[/code]
这个很简单啊!
我在这里给你说一下思想,其它对于这一点,主要是javascript方面的,和rails的关系不大,因为原理都差不多.
在表单内有一个hidden field,名为[color=red]ids[/color]
每当我们选中一个check box后,就将ids的值追加 [color=red],id[/color]
那个id是指每个check box的id.
这样当我们选了若干个check box后,表单中的名为ids的hidden的值就为是这个样子:
[color=red]1,2,3,5,6[/color]
然后我们点删除的话,就将ids作为参数传到controller的action,然后调用一些activerecord的方法来删除这多条记录.
就是这样子.
不知道我讲明白了没有.
我又想了一下,这样不知道可不可以,你试试看,比我上面说的简单一些:
[code="java"]
<% form_tag(:action => 'to_delete') %>
<% for term in @terms %>
///////////////////////
def to_delete
if request.post?
terms = params[:to_delete].map { |t| Term.find_by_permalink(t) }
terms.delete(nil)
terms.each { |t| t.destroy }
redirect_to :controller => 'terms', :action => 'letter'
end
end
[/code]
最好采用第一楼,使用js构造hidden域,这样提交表单的url更容易符合REST的删除方法约定。
删除数据也应该用第二楼的方法,rails中对象执行destroy方法可以增加回调动作,比如关联删除(:depedent => :destroy)也只能在destroy中执行。