【问题标题】:Rails collection route to delete many records at onceRails收集路线一次删除多条记录
【发布时间】:2015-01-20 09:03:17
【问题描述】:

我为 remove_multiple 创建了一个收集路由:

resources :myfiles do
  collection do
    delete 'remove_multiple' => 'myfiles#remove_multiple'
  end
end

这是我的看法:

<%= form_tag remove_multiple_myfiles_path, method: :delete do %>
<table>
.....
<td><%= check_box_tag "myfile_ids[]", myfile.id %></td>
.....
</table>
<%= submit_tag "Delete all" %>
<% end %>

这是我的控制器:

before_action :set_myfile, :check_user, except: [:remove_multiple]

def remove_multiple
 @myfiles = Myfile.find(params[:myfile_ids])
 @myfiles.each do |myfile|
  myfile.destroy
 end
 flash[:notice] = "Deleted files!"
 redirect_to trashcan_path
end

但控制台是这样说的:

Started DELETE "/myfiles/remove_multiple" for ::1 at 2015-01-20     14:16:02 +0530
Processing by MyfilesController#destroy as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"VebaegOfVddyLiOs9oWP4DcLReC7ZPyttpKulIWMOMZN1JJ18T07aMirTSsqWkiDZOL8yMZ1iYi093tk4Qx4KQ==", "myfile_ids"=>["55", "56", "57"], "commit"=>"Delete all", "id"=>"remove_multiple"}
Myfile Load (0.3ms)  SELECT  `myfiles`.* FROM `myfiles` WHERE `myfiles`.`id` = 0 LIMIT 1
Redirected to http://localhost:3000/
Filter chain halted as :set_myfile rendered or redirected
Completed 302 Found in 5ms (ActiveRecord: 0.3ms)

为什么要执行 Myfiles#destroy 方法?即使我指定了路线?

【问题讨论】:

  • 你的 set_myfile 方法有什么?
  • 它是由我的脚手架创建的。这是标准: def set_myfile @myfile = Myfile.find(params[:id]) rescue ActiveRecord::RecordNotFound redirect_to(root_path) end
  • 你没有将 id 传递给 params[:id],因此你甚至没有进入你的删除方法
  • 它不应该去破坏行动。它应该去 remove_multiple,它永远不需要点击 set_myfile 或需要一个 ID。因为它是一个收集路线。
  • @SwaathiK,在您看来,在表单中您有一个 my_file 对象还是一个数组。从您的控制器看起来您正在尝试删除与产品关联的所有 my_files。但从视图看来,您正在尝试删除单个 my_file。请澄清:)

标签: ruby-on-rails rails-routing


【解决方案1】:

在你的 routes.rb 中:

resources :myfiles do
  collection do
    delete 'remove_multiple'
  end
end

# 在你的视野中。

 # You are not passing the object id which you want to delete. 
 # see here, we are passing my_file.id in the path 
    <%= form_tag remove_multiple_myfiles_path(file_id: my_file.id), 
       method: :delete do %>
    <% end %> 

#my_files_controller.rb

#Exclude your remove_multiple action from any before_actions.
   def remove_multiple
     file_ids = params["myfile_ids"]
      Product.where(id: file_ids).destroy_all
   end

【讨论】:

  • 我正在通过复选框传递 ID。如果您检查我在上面发布的日志,您会看到 ID 实际上正在传递,但只是传递给了错误的控制器操作。
  • 太好了,如果参数来了,那么问题一定是路由重定向尝试按照我在这个答案中显示的方式添加路由。顺便说一句,你得到了多个 file_ids Product.delete_all(["id in (?)", params['myfile_ids'] ])
  • 只需更改路线,因为我指定尝试获取 remove_multiple 操作中的参数(您可以使用 raise params.inspect 检查)然后使用 Product.where(id: params['myfile_ids'] ).destroy_all 尝试让我知道这是否不起作用。 :)
  • 路线完全相同。我刚刚添加了一个进一步的控制器操作来映射到路线。问题是它重定向到错误的控制器功能。参数不是问题:)
  • 是的,这里只关心路线和击中不正确的动作。之后,您可以处理参数。注意:delete 'remove_multiple' => 'myfiles#remove_multiple',而不是只提到 delete 'remove_multiple' 我创建了一个示例应用程序,它适用于我。 :)
【解决方案2】:

您使用的是 Rails 4 对吗?看起来不错,但delete :remove_multiple 应该比delete 'remove_multiple' =&gt; 'myfiles#remove_multiple' 更清晰。先运行rake routes,看看remove_multiple_myfiles_path映射到什么。

【讨论】:

  • 它被映射到正确的控制器功能。 remove_multiple_myfiles DELETE /myfiles/remove_multiple(.:format) myfiles#remove_multiple。但我不知道这种奇怪的行为是从哪里来的。
  • 是的,这很奇怪。你的路线和形式看起来都是合法的。如果我是你,我会先运行curl -X DELETE http://host:post/myfiles/remove_multiple(你现在需要添加skip_before_action :verify_authenticity_token 来禁用csrf 保护)。如果它是由正确的操作处理的,那么问题就出在你的表单上,如果没有,那就是路线有问题。如果仍然没有出现,请查看 Gemfile 中的内容。无论如何,您的 Rails 版本是什么,我检查了 4.0.2,它按预期工作。
  • 我将 HTTP 方法更改为 POST,它立即开始工作。那是怎么回事? ://
  • 抱歉不能在 Rails 4.0 或 Rails 4.1 上重现。也许你应该用一个简单的例子来测试。新建一个控制器,添加路由,先用 curl 测试一下,看看能不能用。
【解决方案3】:

所以问题出在路线上。我不知道这是否特定于我的 Rails 应用程序或 Rails 本身,但路由不允许集合中的 DELETE 方法,而是不断重定向到默认的销毁操作。

所以我只是将 remove_multiple 路由设置为 POST。

collection do
  post 'remove_multiple' => 'myfiles#remove_multiple'
end

【讨论】:

    【解决方案4】:

    这应该会有所帮助

    resources :myfiles do
        collection do
            delete "/" => :remove_multiple, as: :remove_multiple 
        end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2020-08-27
      相关资源
      最近更新 更多