在Rails 3中更新(隐藏)一组对象

时间:2011-10-13 18:24:40

标签: ruby ruby-on-rails-3

我在确定以组为单位更新对象的方法时遇到了一些困难。我有一个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

1 个答案:

答案 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中使用上述语法时自动生成的路径助手