Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 更新(隐藏)Rails 3中的一组对象_Ruby_Ruby On Rails 3 - Fatal编程技术网

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

Ruby 更新(隐藏)Rails 3中的一组对象,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我很难确定任何方法来更新我的对象作为一个组。我有一个警报模型,它为用户提供了一些警报。我想提供一种批量更新它们的方法,因为我注意到我经常想这样做。我只是不太了解Rails,不知道什么是“Rails之路” 我的控制器: class AlertsController < ApplicationController def index @alerts = Alert.all(show: true) end def destroy alert = Alert.get(p

我很难确定任何方法来更新我的对象作为一个组。我有一个
警报
模型,它为用户提供了一些警报。我想提供一种批量更新它们的方法,因为我注意到我经常想这样做。我只是不太了解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
我想要的是在我的索引页上有一个链接
Delete All
,我可以用它来隐藏(更新)所有警报。我一直在尝试为我的控制器使用
destroy\u all
方法,但我觉得这不是一个正确的方法,因为我不知道如何链接到类似的东西。谢谢你给我指明了正确的方向

这是我破解的
destroy\u 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

我不知道您是如何路由到此控制器的,但我可能会这样做:

#routes.rb
resources :alerts do
  delete :remove_all, :on => :collection
end
def remove_all
  Alert.update_all({ show: false }, { show: true })
  respond_to do |format|
    format.js {render :nothing => true}
  end
end
= link_to "Remove All", remove_all_alerts_path, :confirm => "Are you sure", :method => :delete, :remote => :true
这将创建一个类似于
/alerts/remove\u all
的路由,该路由只能通过DELETE协议调用。通过指定:collection,它告诉路由,此路由不是一个特定警报的子路由,因此不包括:id

那么控制器的动作可能看起来像这样:

#routes.rb
resources :alerts do
  delete :remove_all, :on => :collection
end
def remove_all
  Alert.update_all({ show: false }, { show: true })
  respond_to do |format|
    format.js {render :nothing => true}
  end
end
= link_to "Remove All", remove_all_alerts_path, :confirm => "Are you sure", :method => :delete, :remote => :true
update\u all
功能将确保每个要删除的警报只有一个数据库更新,而不是一个数据库更新。第一个参数是包含更新的哈希,第二个参数是包含更新记录条件的哈希

从视图中,您应该能够链接到如下操作:

#routes.rb
resources :alerts do
  delete :remove_all, :on => :collection
end
def remove_all
  Alert.update_all({ show: false }, { show: true })
  respond_to do |format|
    format.js {render :nothing => true}
  end
end
= link_to "Remove All", remove_all_alerts_path, :confirm => "Are you sure", :method => :delete, :remote => :true

remove\u all\u alerts\u path
是在routes中使用上述语法时自动生成的路径帮助程序。rb

请注意,如果您的意思是“更新”,请不要说“delete”。它们是两种不同的东西。我会更新你的问题并删除任何“删除”的引用。@bricker,我可以尊重这一点,并且已经这样做了,尽管我认为,在这种情况下,答案要求没有任何变化。当我看到它完成时,这是非常有意义的。。。希望很快我就能为自己找到范例。谢谢明天早上我会试试的。