2

私は溝のユーゴーよりも悪い立ち往生しています。

最終的にこの作業を行うための変更を以下に追加しました (太字の編集としてマークされています)。

バックグラウンド

  • ウィジェットには多くのガジェットがあります
  • テーブルの最後の td 列では、check_box_tags削除する個々のガジェット レコードを選択する必要があります

望ましい動作

  • ユーザーは「checkall」と個々のチェックボックスをクリックしてガジェットを 1 つずつ選択できる必要があります。
  • 「選択した項目を削除」ボタンをクリックすると、ページを更新せずにチェックされたレコードが削除されます

編集: 何が機能していないかについてのより具体的な詳細を追加する

観察された行動

  • 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を使用して配列から「すべて」の値を削除しようとしています。アレイをコンソールに記録すると、「すべて」が正常に削除されます。それでも、ガジェット コントローラーに送信され続けます。

EDIT rails リモート フォームは、POST 要求のガジェット配列を設定します。正しく設定する必要がありました。

モデル

ウィジェット.rb

class Widget < ActiveRecord::Base
  has_many :gadgets
  validates_presence_of :name
end

ガジェット.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

ルート.rb

コレクション 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
4

1 に答える 1

2

これが適切に機能するようになった後、完全なソリューションを投稿したいと思いました。

ここにすべてを入力するのではなく、GitHub で完全なアプリケーションを参照してください。

このソリューションは機能しますが、ソリューションを最適化する方法を知りたいと思っています。助けてくれた人たちにもう一度感謝します!

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

于 2012-04-07T18:07:58.393 に答える