Проблема с активным хранилищем Rails с удалением отдельных загрузок

Я сохраняю некоторые файлы в локальное хранилище через активное хранилище. Я показываю их как ссылки на своей странице. Это могут быть PDF-файлы, изображения, текстовые документы и т. Д. Я хочу, чтобы рядом с ним была ссылка, чтобы иметь возможность удалять отдельные файлы, но еще не заставил ее работать. Вот что у меня есть:

Модель проектов:

class Project < ApplicationRecord

belongs_to :user

has_one :proj_status, :foreign_key => "status_id", :primary_key => 'status_id'

has_many_attached :uploads

end

Страница выставки проектов:

<%= link_to upload.filename, rails_blob_path(upload, disposition: :attachment) %>

<%= link_to 'Remove', delete_upload_project_url(upload.id), method: :delete, data: { confirm: 'Are you sure?' } %>

Метод загрузки удаления из контроллера проектов:

def delete_upload

attachment = ActiveStorage::Attachment.find(params[:id])

attachment.purge # or use purge_later

redirect_back(fallback_location: projects_path)

end

Я получаю сообщение об ошибке:

[GET] "/ projects / 1 / delete_upload" не соответствует ни одному маршруту

Я думаю, что это проблема маршрутизации, но мне еще не удалось заставить ее работать.

Также вот раздел моих маршрутов:

resources :projects do

  member do

  delete :delete_upload

  end

end

Любые мысли или идеи о том, как заставить это работать?

Вот мои рейк-маршруты для раздела проектов:

DELETE /projects/:id/delete_upload/:upload_id(.:format) projects#delete_upload

projects GET /projects(.:format) projects#index

POST /projects(.:format) projects#create

new_project GET /projects/new(.:format) projects#new

edit_project GET /projects/:id/edit(.:format) projects#edit

project GET /projects/:id(.:format) projects#show

PATCH /projects/:id(.:format) projects#update

PUT /projects/:id(.:format) projects#update

DELETE /projects/:id(.:format) projects#destroy

Если кто-нибудь может мне помочь с этим, я был бы признателен!


person spacerobot    schedule 07.10.2018    source источник


Ответы (2)


Ваш delete_upload_project_url метод ожидает двух переменных: проекта и загрузки /projects/:id/delete_upload/:upload_id. Вы передаете только идентификатор загрузки. Сделайте что-нибудь вроде delete_upload_project_url(project.id, upload.id).

person arieljuod    schedule 07.10.2018
comment
Спасибо, когда я изменяю link_to на ‹% = link_to 'Remove', delete_upload_project_url (@ project.id, upload.id), method:: delete_upload, data: {confirm: 'Вы уверены?' }% ›Я получаю сообщение" Нет совпадений "[GET] /projects/6/delete_upload.1 - person spacerobot; 07.10.2018
comment
method - это метод HTTP, который следует использовать в запросе, а не фактическое имя метода вашего действия, выполните method: :delete вместо method: :delete_upload. Я не знаю, почему вы это изменили, это нормально по вашему первоначальному вопросу. - person arieljuod; 08.10.2018
comment
При изменении link_to обратно на method: delete возникает та же ошибка: ни один маршрут не соответствует [GET] /projects/1/delete_upload.6 - person spacerobot; 08.10.2018
comment
Попробуйте с delete_upload_project_url(id: project.id, upload_id: upload.id). В любом случае, я думаю, вам было бы проще использовать соглашение Rails для обработки операций CRUD с вложенными ресурсами, проверьте руководство guides.rubyonrails.org/routing.html#nested-resources - person arieljuod; 08.10.2018
comment
Спасибо, поэтому, когда я изменяю link_to на то, что вы указали выше, я получаю сообщение Нет совпадений маршрута [GET] / projects / 1 / delete_upload. Может, по какой-то причине у него нет идентификатора загрузки? Глядя на вложенные ресурсы, это означало бы, что мне нужно было бы правильно создать контроллер и модель загрузки? - person spacerobot; 08.10.2018
comment
Извините, я только что увидел, что вы не используете вложенные ресурсы, у вас есть вложения, поэтому использование маршрутизации вложенных ресурсов кажется слишком сложным для этого. Попробуйте с url_for(controller: :projects, action: :delete_upload, id: project.id, upload_id: upload.id), вывод ваших рейк-маршрутов показывает это, я не понимаю, почему он продолжает говорить, что для этого нет маршрута. - person arieljuod; 08.10.2018
comment
Да, я не понимаю. При переходе на URL_for я получаю то же значение Нет совпадений маршрута [GET] / projects / 1 / delete_upload error: когда я нахожу указатель мыши на ссылку удаления, это ссылка. localhost: 3000 / projects / 1 / delete_upload? upload_id = 1 Идентификаторы совпадают правильно, поэтому я не уверен, почему я получаю ошибку маршрута. - person spacerobot; 08.10.2018

С самого начала все было настроено правильно. Проблема заключалась в том, что я случайно удалил include для application.js из своего проекта. Отсутствие ссылки на UJS приводило к получению всех запросов вместо удаления в моем случае.

person spacerobot    schedule 08.10.2018