Я застрял хуже, чем 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
Может быть, лучше использовать 'accepts_nested_attributes_for'? – MikDiet
Так в чем вопрос? Что не работает? –
Привет, Фредерик, было совершенно непонятно, какова была настоящая проблема! Извини за это. Я добавил несколько подробностей. Спасибо, – hernamesbarbara