我在确定以组为单位更新对象的方法时遇到了一些困难。我有一个Alert
模型,它为用户提供了一些警报。我想提供一种批量更新它们的方法,因为我注意到我经常想要。我只是不知道Rails是否足以知道“Rails方式”是什么。
我的控制器:
class AlertsController < ApplicationController
def index
@alerts = Alert.all(show: true)
end
def destroy
alert = Alert.get(params[:id])
## I lied, I'm not really deleting things, just hiding them from showing
alert.update(show: false) if alert
respond_to do |format|
format.js { render :nothing => true }
end
end
我一直在* .html.haml视图中使用此代码为每个单独的警报创建删除链接:
- @alerts.each do |alert|
%span{ :class => 'description' }=alert.description
= link_to "Destroy", alert, :confirm => "Are you sure", :method => :delete, :remote => :true
我想要的是我的索引页面Delete All
上的链接,我可以使用它来隐藏(更新)所有警报。我一直用我的控制器destroy_all
方法尝试这个,但我觉得这不是一个正确的方法,因为我不知道如何链接到这样的东西。谢谢你指点我正确的方向。
以下是我一起入侵的destroy_all
方法,供参考。
def destroy_all
@alerts.each do |alert|
alert.update(show: false) if alert
respond_to do |format|
format.js {render :nothing => true}
end
end
end
答案 0 :(得分:1)
我不知道你如何路由到这个控制器,但我可能会做这样的事情:
#routes.rb
resources :alerts do
delete :remove_all, :on => :collection
end
这将创建一个类似/alerts/remove_all
的路由,只能通过DELETE协议调用。通过指定:collection它告诉路由这条路由不是到一个特定Alert的子路由所以no:id包含在内。
然后控制器动作可能看起来像这样:
def remove_all
Alert.update_all({ show: false }, { show: true })
respond_to do |format|
format.js {render :nothing => true}
end
end
update_all
函数将确保每个要删除的警报只有一个数据库更新而不是一个。第一个参数是包含更新的哈希,第二个参数是一个哈希,其中包含要更新记录的条件。
从视图中你应该可以链接到这样的动作:
= link_to "Remove All", remove_all_alerts_path, :confirm => "Are you sure", :method => :delete, :remote => :true
remove_all_alerts_path
是在routes.rb中使用上述语法时自动生成的路径助手