【发布时间】: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