2015-01-20 2 views
1

Я создал коллекцию маршрут для remove_multiple:Рельсы коллекция маршрут удалить много записей сразу

resources :myfiles do 
    collection do 
    delete 'remove_multiple' => 'myfiles#remove_multiple' 
    end 
end 

Вот мое мнение:

<%= form_tag remove_multiple_myfiles_path, method: :delete do %> 
<table> 
..... 
<td><%= check_box_tag "myfile_ids[]", myfile.id %></td> 
..... 
</table> 
<%= submit_tag "Delete all" %> 
<% end %> 

А вот мой контроллер:

before_action :set_myfile, :check_user, except: [:remove_multiple]

def remove_multiple 
@myfiles = Myfile.find(params[:myfile_ids]) 
@myfiles.each do |myfile| 
    myfile.destroy 
end 
flash[:notice] = "Deleted files!" 
redirect_to trashcan_path 
end 

Но вот что консоль говорит:

Started DELETE "/myfiles/remove_multiple" for ::1 at 2015-01-20  14:16:02 +0530 
Processing by MyfilesController#destroy as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"VebaegOfVddyLiOs9oWP4DcLReC7ZPyttpKulIWMOMZN1JJ18T07aMirTSsqWkiDZOL8yMZ1iYi093tk4Qx4KQ==", "myfile_ids"=>["55", "56", "57"], "commit"=>"Delete all", "id"=>"remove_multiple"} 
Myfile Load (0.3ms) SELECT `myfiles`.* FROM `myfiles` WHERE `myfiles`.`id` = 0 LIMIT 1 
Redirected to http://localhost:3000/ 
Filter chain halted as :set_myfile rendered or redirected 
Completed 302 Found in 5ms (ActiveRecord: 0.3ms) 

Почему исполняющий MYFILES # уничтожить метод? Даже когда я укажу маршрут?

+0

Что в вашем методе set_myfile? – Avdept

+0

Создан мой эшафот. Это стандарт: Защиту set_myfile @myfile = Myfile.find (Params [: ID]) спасательное ActiveRecord :: RecordNotFound redirect_to (root_path) конец –

+0

вы не передаете идентификатор Params [: ID], поэтому вы даже не попадаете в свой метод удаления. – Avdept

ответ

0

Вы используете Rails 4 справа? Это выглядит хорошо, но delete :remove_multiple должно быть яснее, чем delete 'remove_multiple' => 'myfiles#remove_multiple'. Сначала запустите rake routes, посмотрите, к чему привязан remove_multiple_myfiles_path.

+0

Он отображается на правильную функцию контроллера. 'remove_multiple_myfiles DELETE /myfiles/remove_multiple(.:format) myfiles # remove_multiple'. Но я не знаю, откуда такое странное поведение. –

+0

Да, это странно. Как ваш маршрут, так и форма выглядят законно. Если бы я был вами, я бы сначала запустил 'curl -X DELETE http: // host: post/myfiles/remove_multiple' (вам нужно добавить' skip_before_action: verify_authenticity_token', чтобы отключить защиту csrf на данный момент). Если он обрабатывается правильным действием, тогда проблема в вашей форме, если нет, то это неправильно с маршрутом. Если все еще ничего не появляется, посмотрите, что в вас Gemfile. И какова ваша версия Rails в любом случае, я проверил с 4.0.2, она работала, как ожидалось. –

+0

Я изменил метод HTTP на POST и сразу начал работать. Что с этим? :/ –

0

В вашем routes.rb:

resources :myfiles do 
    collection do 
    delete 'remove_multiple' 
    end 
end 

# В вашем View.

# You are not passing the object id which you want to delete. 
# see here, we are passing my_file.id in the path 
    <%= form_tag remove_multiple_myfiles_path(file_id: my_file.id), 
     method: :delete do %> 
    <% end %> 

# my_files_controller.rb

#Exclude your remove_multiple action from any before_actions. 
    def remove_multiple 
    file_ids = params["myfile_ids"] 
     Product.where(id: file_ids).destroy_all 
    end 
+0

Я передаю идентификаторы с помощью флажка. Если вы проверите журнал, который я разместил выше, вы увидите, что идентификаторы передаются infact, но только к неправильному действию контроллера. –

+0

Отлично, если параметры появляются, проблема должна быть связана с перенаправлением маршрута. Попробуйте добавить маршруты так, как я показал в этом ответе. Кстати, вы получаете несколько file_ids Product.delete_all (["id in (?)", Params ['myfile_ids']]) – Ajay

+0

Просто измените маршрут, как я указал попытку получить параметры в remove_multiple (вы можете проверить, используя параметр raise params.inspect) Затем используйте Product.where (id: params ['myfile_ids']). destroy_all Попробуйте и дайте мне знать, если это не сработает. :) – Ajay

0

Так что вопрос был с маршрутами. Я не знаю, относится ли это к моему Rails-приложению или к Rails самому, но маршруты не позволяют использовать метод DELETE в коллекции, вместо этого он перенаправляет на действие уничтожения по умолчанию.

Так что я просто сделал мой маршрут remove_multiple как POST.

collection do 
    post 'remove_multiple' => 'myfiles#remove_multiple' 
end 
Смежные вопросы