ruby-on-rails - 无法清除事件存储附件

标签 ruby-on-rails ruby-on-rails-5 rails-activestorage

我有一个名为 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

我有一个显示资源并循环附加 Assets 的表单。下面是循环访问 Assets 的代码片段:

<% @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 页面正确显示资源以及附加的 Assets 。但是,当我尝试单击链接来删除其中一项 Assets 时,我收到一条错误:“nil:NilClass 的未定义方法‘purge’”。但是,在控制台中我看到附件存在。

这是服务器控制台的输出:

    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 指南或网络上的其他任何地方都非常缺乏专门处理删除附件的具体细节和示例。将不胜感激任何帮助。

更新:这是我的routes.rb:

资源:资源做 获取 '列表', :on => :collection 把:排序,放在::集合上 成员(member)做 删除:删除_ Assets _附件 结尾 结束

更新2:rails路线输出

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

最佳答案

我已经能够完成这项工作。啊啊啊。经过几个小时的沮丧之后,匆忙。

读完这篇文章后将事情拼凑起来 Deleting ActiveStorage Attachments From the Controller, 3 Ways

我将 Controller 代码更改为:

  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 id,但未找到附件。关键是改变这一行:

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

...更正确地指向正确的资源,然后指向要清除的特定 Assets (附件)。

关于ruby-on-rails - 无法清除事件存储附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55082650/

相关文章:

ruby-on-rails - 在 Rails 中创建后打印对象属性

angular - 如何在 angular2 模型上声明日期属性

ruby-on-rails - 如何使用 Rails ActiveStorage 将一个对象从一个模型复制到另一个模型

ruby-on-rails - 将数据从 CSV 导入到 PSQL

ruby-on-rails - 在 Rails 3 中使用 Cucumber/Capybara,如何设置自定义 User-Agent 字符串?

ruby-on-rails - rails : Upload to Instagram programmatically?

ruby-on-rails - 作为跟随者设置

ruby-on-rails - config.action_mailer.asset_host 不提供来自云前端 CDN 的图像

ruby-on-rails - 如何使用 rails 的 Active Storage 从 Rails 表单中的 <canvas/> 将图像上传到 S3?

activeadmin - 带有Active Storage的active_admin中的多个上传图像