Как удалить несколько записей одновременно с помощью Rails 3 и нескольких элементов check_box_tag

Я застрял в канаве хуже, чем Юго.

Я добавил изменения, которые в конечном итоге сделали эту работу ниже (отмечены жирным шрифтом изменения).

Фон

  • У виджетов много гаджетов
  • В последнем столбце td таблицы есть check_box_tags для выбора отдельных записей гаджетов для удаления.

Желаемое поведение

  • Пользователь должен иметь возможность нажимать «галочку», а также отдельные флажки, чтобы выбирать гаджеты по одному.
  • Нажатие кнопки «Удалить выбранное» должно удалить отмеченные записи без обновления страницы.

РЕДАКТИРОВАТЬ: Добавление более подробной информации о том, что не работает

Наблюдаемое поведение

  • метод destroy_multiple в gadgets_controller.rb никогда не вызывается
  • вместо этого кажется, что метод 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" - это css id 1 флажка, используемого для "checkall". В файле checkbox.js.coffee ниже я пытаюсь удалить значение «все» из массива с помощью javascript. Когда я записываю массив в консоль, «все» удаляется успешно. Тем не менее, он продолжает отправляться контроллеру гаджетов.

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
    @[email protected](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])
    @[email protected] 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

person Community    schedule 24.03.2012    source источник
comment
Может лучше использовать accepts_nested_attributes_for?   -  person mikdiet    schedule 24.03.2012
comment
Так в чем вопрос? Что не работает?   -  person Frederick Cheung    schedule 25.03.2012
comment
Привет, Фредерик - было совершенно непонятно, в чем была настоящая проблема! Извини за это. Я добавил еще несколько деталей. Спасибо,   -  person hernamesbarbara    schedule 25.03.2012
comment
Извините за многословный вопрос и за ответ на мой собственный вопрос. Виджеты destroy_multiple теперь работают правильно, и я включил изменения, которые сделал выше. Основная проблема заключалась в том, что я пытался создать свои собственные функции javascript для вещей, которые Rails хочет делать для вас автоматически через удаленные формы.   -  person hernamesbarbara    schedule 25.03.2012
comment
Вы должны взять свое решение и предоставить его в качестве ответа   -  person Azolo    schedule 25.03.2012


Ответы (1)


После того, как это заработало должным образом, я хотел опубликовать полное решение.

Вместо того, чтобы вводить все это здесь, посмотрите полное приложение на GitHub.

Пока это решение работает, мне было бы очень интересно узнать, как я могу его оптимизировать. Еще раз спасибо тем, кто помогал!

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

person hernamesbarbara    schedule 07.04.2012