【发布时间】:2012-03-24 18:29:25
【问题描述】:
我被困在沟里比 Yugo 更糟糕。
我在下面添加了最终完成这项工作的更改(标记为粗体 edits)。
背景
- Widgets 有很多 Gadgets
- 表中最后的 td 列有
check_box_tags用于选择要删除的单个小工具记录
期望的行为
- 用户应该能够单击“checkall”以及单个复选框来一次选择一个小工具
- 单击“删除选定项”按钮应删除选中的记录而不刷新页面
编辑: 添加更多关于不工作的具体细节
观察到的行为
- gadgets_controller.rb 中的destroy_multiple 方法永远不会被调用
-
相反,create 方法似乎被调用了
Started POST "/widgets/1/gadgets" ...Processing by GadgetsController#create as JSParameters: {"utf8"=>"✓", "authenticity_token"=>"...=", "widget"=>{"gadget_ids"=>["all", "140", "139"]}, "widget_id"=>"1"}Widget Load (0.3ms) SELECT "widgets".* FROM "widget" WHERE "widget"."id" = $1 LIMIT 1 [["id", "1"]]Rendered gadgets/create.html.haml within layouts/application (1.1ms)Rendered layouts/_header.html.haml (0.2ms)Completed 200 OK in 36ms (Views: 19.0ms | ActiveRecord: 5.0ms)
我对此也不清楚:{"gadget_ids"=>["all", "140", "139"]}。
“all”是用于“checkall”的 1 个复选框的 css id。在下面的 checkbox.js.coffee 文件中,我尝试使用 javascript 从数组中删除“all”值。当我将阵列记录到控制台时,“全部”已成功删除。但它会继续发送到小工具控制器。
EDIT rails 远程表单为 POST 请求填充小工具数组。只需正确设置即可。
型号
widget.rb
class Widget < ActiveRecord::Base
has_many :gadgets
validates_presence_of :name
end
gadget.rb
class Gadget < ActiveRecord::Base
belongs_to :widget
validates_presence_of :widget_id
end
小工具控制器
class GadgetsController < ApplicationController
include ApplicationHelper
before_filter :get_widget
before_filter :widget_gadgets, only: [ :index ]
respond_to :json
def json_widgets
[ @widget, @gadgets ]
end
def index
respond_with(json_widgets) do |format|
format.json
format.html
end
end
def new
@gadget = @widget.gadgets.new()
end
def create
@gadget=@widget.gadgets.new(params[:gadget])
if @gadget.save
flash[:success] = "Gadget was successfully created"
redirect_to widget_gadgets_path
end
end
def destroy_multiple
gadget_ids=(params[:gadget_ids])
to_delete=[]
gadget_ids.split(',').each do |gadget_id|
to_delete.push(Gadget.find(gadget_id))
end
to_delete.each do |del|
del.destroy()
end
flash.now[:success] = "Gadget Destroyed Successfully"
respond_to do |format|
format.html { redirect_to widget_gadgets_path(@widget) }
format.json { render :json => to_delete.to_json }
end
end
def destroy
@gadget = gadget.find(params[:gadget_id])
@widget.gadgets.destroy(@gadget.id)
respond_to do |format|
format.html { redirect_to(widget_gadgets_path) }
end
end
def get_widget
begin
@widget = Widget.find(params[:widget_id])
rescue ActiveRecord::RecordNotFound
render file: "public/404.html", status: 404
end
end
private
def widget_gadgets
@widget=Widget.find(params[:widget_id])
@gadgets=@widget.gadgets unless @widget.gadgets.nil?
end
end
routes.rb
我正在尝试使用 collection do 块。这是实现 destroy_multiple 路由的正确方法吗?
DestroyMultiple::Application.routes.draw do
resources :widgets
resources :gadgets, :only => [ :new, :create ]
resources :widgets do
resources :gadgets do
collection do
post :destroy_multiple
end
end
end
match "/:id" => 'widget#gadgets'
root to: 'widgets#index'
end
【问题讨论】:
-
使用
accepts_nested_attributes_for可能会更好? -
那么问题是什么?什么不起作用?
-
嗨 Frederick - 完全不清楚实际问题是什么!对于那个很抱歉。我添加了更多细节。谢谢,
-
很抱歉这个冗长的问题和回答我自己的问题。 destroy_multiple 小部件现在可以正常运行,并且我已经包含了我在上面所做的更改。主要问题是我试图为 Rails 想要通过远程表单自动为你做的事情创建自己的 javascript 函数。
-
您应该采用您的解决方案并将其作为答案提供
标签: ruby-on-rails checkbox checked jqueryform delete-record