【问题标题】:Removing ActiveStorage attachments in Rails 5在 Rails 5 中删除 ActiveStorage 附件
【发布时间】:2019-04-23 23:10:13
【问题描述】:

我有一个包含产品的应用程序 - 每个产品都有注释/常见问题解答/附件等内容。

我可以成功删除笔记和常见问题,但不能删除 Active Storage 附件。

有人可以帮忙吗?我尝试在 Products 控制器中使用单独的方法,但没有奏效,因此我当前的行使用的是 Uploads 控制器。

我得到的当前错误是:

NameError in UploadsController#destroy
uninitialized constant Upload

上传控制器:

class UploadsController < ApplicationController
  load_and_authorize_resource :nested => :product       

    def destroy
        @product = Product.find(params[:id])
        @upload = @product.ActiveStorage::Attachment.find(params[:id])

        @upload.purge 

        redirect_back(fallback_location: products_path)
    end

end

产品视图:

<% @product.uploads.each do |upload| %>
      <% if can? :destroy, upload %>
     <td><%= link_to t('X', :default => t("X")),
                      product_upload_path(@product, upload),
                      :method => :delete,
                      :data => { :confirm => t('.confirm', :default => 'Are you sure you want to delete this attachment?') },
                      :id =>'delete-faq' %></td>
      <% end %>
      <% if upload.variable? %>
        <span><%= image_tag upload.variant(resize: "100x100"), class: "other-image" %></span>
      <% elsif upload.previewable? %>
        <span><%= link_to image_tag(upload.preview(resize: "100x100"), class: "other-image"), rails_blob_path(upload), target: "_blank" %></span>
      <% else %>
        <span><%= link_to image_tag("paper.jpg", size: "100x100", class: "other-image"), rails_blob_path(upload), target: "_blank" %></span>
      <% end %>
    <% end %>

路线:

  resources :products do
    resources :notes
    resources :faqs
    resources :uploads 
  end

【问题讨论】:

  • 我也尝试过使用 @upload = @product.upload.find(params[:id]) 代替,它给出了同样的错误。
  • 谢谢 - 我已经尝试过了,不幸的是无法让它为我工作,但我终于让它工作了,所以发布了一个答案。

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


【解决方案1】:

我知道这不是最 RESTful 的解决方案,但我得到了它的工作,所以我添加这个作为答案,以防它帮助其他人撕毁他们的头发。

我检查了日志,它确实删除了附加的图像和 blob。

在我的例子中,一个产品有_many 上传。

routes.rb:

resources :products do
    resources :uploads do
    match '/remove', to: 'products#remove', via: 'delete'
    end
  end

产品控制器(是的,我知道,放在这里并不理想)

def remove
        @product = Product.find(params[:product_id])
        @upload = @product.uploads.find(params[:upload_id])
        @upload.purge

        redirect_to product_path(@product), notice: "Upload was successfully removed."
    end

产品展示视图:

 <% @product.uploads.each do |upload| %>
      <%= link_to "X", product_upload_remove_path(@product, upload),
                      :method => :delete,
                      :data => { :confirm => t('.confirm', :default => 'Are you sure you want to delete this upload?') },
                      :id =>'delete-faq', :class => 'delete' %></td>
 <% end %>

希望这将对其他人有所帮助或为更 RESTful 的解决方案奠定基础。

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 2018-02-02
    • 2019-07-24
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2019-06-12
    相关资源
    最近更新 更多