【问题标题】:How to delete multiple records simultaneously using Rails 3 and multiple check_box_tag elements如何使用 Rails 3 和多个 check_box_tag 元素同时删除多条记录
【发布时间】: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 JS
    Parameters: {"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


【解决方案1】:

在让它正常工作后,我想发布完整的解决方案。

与其在这里全部输入,不如在 GitHub 上查看完整的应用程序。

虽然此解决方案有效,但我很想知道如何优化该解决方案。再次感谢帮助过的人!

https://github.com/hernamesbarbara/AJAX-Rails-Full-CRUD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2021-06-13
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多