Не удается удалить активные хранилища - PullRequest
0 голосов
/ 10 марта 2019

У меня есть модель с именем Resource, настроенная с:

class Resource < ActiveRecord::Base    
has_many_attached :assets
end

Я создал действие в моем resources_controller.rb следующим образом:

  def delete_asset_attachment
    @asset = ActiveStorage::Attachment.find_by(params[:id])
    logger.debug "The value of @asset is #{@asset}"
    @asset.purge
    redirect_to @resource
  end

У меня есть форма, которая показывает ресурси циклы через вложенные активы.Ниже приведен фрагмент кода, выполняющего цикл по активам:

<% @resource.assets.each do |asset| %>
<%= link_to 'Remove Attachment', delete_asset_attachment_resource_url(@resource, asset.id), method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>

На странице / resources правильно отображается ресурс вместе с прикрепленными активами.Однако, когда я пытаюсь щелкнуть ссылку, чтобы удалить один из ресурсов, я получаю сообщение об ошибке: «неопределенный метод` purge ”для nil: NilClass».Тем не менее, в консоли я вижу, что вложение существует.

Вот вывод с консоли сервера:

    Started DELETE "/resources/10/delete_asset_attachment.18" for ::1 at 2019-03-09 17:27:28 -0500
Processing by ResourcesController#delete_asset_attachment as 
  Parameters: {"authenticity_token"=>"EFZO5V9Bii3dId0I6hn5DajFR5WJYZBc8qPAAi5ppQOFW3cws5I4FjyVP9IlvA+2a2kKUJhobnqd8atG4L3k+g==", "id"=>"10"}
  Resource Load (0.1ms)  SELECT  "resources".* FROM "resources" WHERE "resources"."id" = ? LIMIT ?  [["id", 10], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ActiveStorage::Attachment Load (0.1ms)  SELECT  "active_storage_attachments".* FROM "active_storage_attachments" WHERE (10) LIMIT ?  [["LIMIT", 1]]
The value of @asset is #<ActiveStorage::Attachment:0x00007f8d7bd4df68>
  ActiveStorage::Blob Load (0.2ms)  SELECT  "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = ? LIMIT ?  [["id", 27], ["LIMIT", 1]]
Completed 500 Internal Server Error in 5ms (ActiveRecord: 0.6ms)

NoMethodError - undefined method `purge' for nil:NilClass:

::1 - - [09/Mar/2019:17:27:28 EST] "POST /resources/10/delete_asset_attachment.18 HTTP/1.1" 500 76939
http://localhost:3000/resources/10/edit -> /resources/10/delete_asset_attachment.18
Started POST "/__better_errors/70da0e976a425fce/variables" for ::1 at 2019-03-09 17:27:28 -0500
  ActiveStorage::Blob Load (0.2ms)  SELECT  "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = ? LIMIT ?  [["id", 27], ["LIMIT", 11]]
::1 - - [09/Mar/2019:17:27:28 EST] "POST /__better_errors/70da0e976a425fce/variables HTTP/1.1" 200 36499
http://localhost:3000/resources/10/delete_asset_attachment.18 -> /__better_errors/70da0e976a425fce/variables

Я искал решения везде.Пара, которая существует в stackoverflow, не решает мою проблему.Существует невероятное отсутствие конкретных деталей и примеров в руководстве по Rails или где-либо еще в Интернете для специальной обработки удаления вложений.Буду признателен за любую помощь.

ОБНОВЛЕНИЕ: Вот мои маршруты.rb:

ресурсы: ресурсы действительно получают «листинг»,: on =>: коллекция помещена: сортировка, в:: член коллекцииdo delete: delete_asset_attachment end end

UPDATE 2: вывод маршрутов по рельсам

resources GET    /resources(.:format)                                                                     resources#index
                             POST   /resources(.:format)                                                                     resources#create
                new_resource GET    /resources/new(.:format)                                                                 resources#new
               edit_resource GET    /resources/:id/edit(.:format)                                                            resources#edit
                    resource GET    /resources/:id(.:format)                                                                 resources#show
                             PATCH  /resources/:id(.:format)                                                                 resources#update
                             PUT    /resources/:id(.:format)                                                                 resources#update
                             DELETE /resources/:id(.:format)                                                                 resources#destroy

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Исправьте синтаксис find_by и используйте безопасный амперсанд, вместо этого

    @asset = ActiveStorage::Attachment.find_by(params[:id])
    @asset.purge

try:

    @asset = ActiveStorage::Attachment.find_by(id: params[:id])
    @asset&.purge
1 голос
/ 10 марта 2019

Я смог сделать эту работу. Аааа. Спешка, после часов разочарования.

Соединение вещей после прочтения этой статьи Удаление вложений ActiveStorage с контроллера, 3 способа

Я изменил свой код контроллера, чтобы быть таким:

  def delete_asset_attachment
    @resource.assets.find_by(params[:attachment_id]).purge
    redirect_to @resource
  end

и моя форма будет такой:

   <% @resource.assets.each do |asset| %>
      <%= asset.filename %>
      <%= link_to 'Remove Attachment', delete_asset_attachment_resource_url(@resource, asset.id), method: :delete, data: { confirm: 'Are you sure?' } %>
   <% end %>

Я считаю, что проблема заключалась в том, что строка в моем старом коде:

@asset = ActiveStorage::Attachment.find_by(params[:id])

... только передавал идентификатор @resource, а вложение не было найдено. Ключ менял эту строку:

@resource.assets.find_by(params[:attachment_id]).purge

... который более правильно указывает на правильный ресурс, а затем на конкретный актив (вложение), который необходимо очистить.

...