2012-03-24 7 views
2

Я застрял хуже, чем Yugo в канаве. Как удалить несколько записей одновременно с помощью Rails 3 и нескольких элементов check_box_tag

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

фон

  • Widgets имеет много Гаджетов
  • В последней колонке TD в таблице имеет check_box_tags выбрать отдельные записи Гаджет для удаления

желательного поведения

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

EDIT:Добавление более подробные сведения о том, что не работает

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

  • метод destroy_multiple в gadgets_controller.rb никогда не называют
  • вместо этого, метод создания, кажется, называется

    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"]}.

«все» - это css id of 1, установленный для «checkall». В файле checkbox.js.coffee ниже я пытаюсь удалить значение «all» из массива с помощью javascript. Когда я регистрирую Array для консоли, «все» успешно удаляется. Тем не менее он по-прежнему отправляется в контроллер гаджетов.

EDITРельсы удаленной формы заполняют массив гаджетов для запроса POST. просто нужно было правильно настроить его.

Модели

виджет.гь

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

Я пытаюсь использовать сотрудничества люк 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 
+0

Может быть, лучше использовать 'accepts_nested_attributes_for'? – MikDiet

+0

Так в чем вопрос? Что не работает? –

+0

Привет, Фредерик, было совершенно непонятно, какова была настоящая проблема! Извини за это. Я добавил несколько подробностей. Спасибо, – hernamesbarbara

ответ

2

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^