标签: rails-activestorage

Rails 5.2 Active Storage清除/删除附件

所以我使用Active Storage上传附加到Collection模型的多个图像.除非我试图从集合中清除/删除单个附件,否则一切都很顺利.

问题:出于某种原因,每当我加载集合的显示页面时,我的所有图像都会被立即清除/删除.当然,每当我点击链接时我只想删除一个文件.有谁知道如何解决这个问题?

我的收藏展示视图:

<div id="gallery">
  <% @collection.images.each do |image| %>
    <%= image_tag(image) %>
    <%= link_to 'Remove image', image.purge %>
  <% end %>
</div>
Run Code Online (Sandbox Code Playgroud)

我已经阅读了http://edgeguides.rubyonrails.org/active_storage_overview.html#removing-files的文档 (参见第4段)

但遗憾的是,这并未提供有关如何专门使用purge或purge_later方法的任何信息.

编辑 目前将我的代码更改为此(仍然遗憾地无效):

<div id="gallery">
  <% @collection.images.each do |image| %>
    <%= image_tag(image) %>
    <%= link_to 'Remove', delete_image_attachment_collections_url(image.signed_id),
                method: :delete,
                data: { confirm: 'Are you sure?' } %>
    <% end %>
</div>
Run Code Online (Sandbox Code Playgroud)

在我的collections_controller.rb中有这个

  def delete_image_attachment
    @image = ActiveStorage::Blob.find_signed(params[:id])
    @image.purge
    redirect_to root_path
  end
Run Code Online (Sandbox Code Playgroud)

我试图删除附加图像后,这给了我这个错误:

在(尝试)删除图像后返回集合节目时出现错误.

服务器日志:

Started DELETE "/collections/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBYdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--3e75276d414b4c2040e02cf0afbc083e2337faa0/delete_image_attachment" for ::1 at 2018-03-29 19:06:55 …
Run Code Online (Sandbox Code Playgroud)

file-upload ruby-on-rails rails-activestorage

12
推荐指数
4
解决办法
1万
查看次数

不使用S3时,ActiveStorage service_url && rails_blob_path无法生成完整URL

我有一个基本的ActiveStorage设置,其中包含一个模型has_many_attached :file_attachments.在其他地方的服务中,我正在尝试生成一个在主应用程序之外使用的链接(电子邮件,工作等).

使用S3生产我可以做到: item.file_attachments.first.service_url我得到了一个到S3 bucket +对象的适当链接.

我无法使用导轨指南中规定的方法: Rails.application.routes.url_helpers.rails_blob_path(item.file_attachments.first)

它错误: ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true 我可以传递一个host: 'http://....'参数,它很高兴,虽然它仍然不会生成完整的URL,只是路径.

在开发中我使用磁盘备份文件存储,我不能使用任何一种方法:

> Rails.application.routes.url_helpers.rails_blob_path(item.file_attachments.first)
ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
Run Code Online (Sandbox Code Playgroud)

在此处设置主机也不会生成完整的URL.

在生产service_url工作中,但是在开发中我得到错误:

> item.file_attachments.first.service_url
ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true …
Run Code Online (Sandbox Code Playgroud)

rails-activestorage

12
推荐指数
1
解决办法
4423
查看次数

Rails Active Storage 无模型

Rails Active Storage 可以在没有模型支持的情况下使用吗?我有一个表格,需要上传文件,但我不希望将其附加到模型中。我只需要上传文件,以便我可以使用后台作业处理它,然后将其删除。

ruby-on-rails rails-activestorage

12
推荐指数
1
解决办法
3773
查看次数

ActiveStorage::Current.host= 已弃用,我如何使用 ActiveStorage::Current.url_options

我使用url方法在 erb 文件中呈现活动记录附件的 url 。

#controller    
class RecordMetadataController < ApplicationController
        before_action do
        ActiveStorage::Current.host = request.base_url
      end
    .
    .
    .
    end


#view
    <iframe src="<%= file.url expires_in: 30 ,disposition: :inline %>" width="600" height="750" style="border: none;"></iframe>
Run Code Online (Sandbox Code Playgroud)

Rails 在我的控制台中给出了弃用警告,因此我尝试更新我的代码,但无法使其工作。

***DEPRECATION WARNING: ActiveStorage::Current.host= is deprecated, instead use ActiveStorage::Current.url_options***
Run Code Online (Sandbox Code Playgroud)

更新的代码

#controller
...
ActiveStorage::Current.url_options = request.base_url
...
Run Code Online (Sandbox Code Playgroud)

新错误

在网络控制台中我试图获取文件的完整网址

>> file.url
ArgumentError: Cannot generate URL for K01_D01_G12.pdf using Disk service, please set ActiveStorage::Current.url_options.
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

ruby-on-rails rails-activestorage

12
推荐指数
1
解决办法
9652
查看次数

在ActiveStorage中使用多个存储桶

有谁知道是否有办法为特定附件配置自定义存储桶?

class MyModel < ApplicationRecord
  ...

  has_one_attached :logo, bucket: 'custom_bucket'

  ...    
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-activestorage

11
推荐指数
2
解决办法
772
查看次数

如何在Rails 5.2中复制存储在ActiveStorage中的文件

我有一个使用ActiveStorage的模型:

class Package < ApplicationRecord
  has_one_attached :poster_image
end
Run Code Online (Sandbox Code Playgroud)

如何创建包含初始poster_image文件副本的Package对象的副本.有点像:

original = Package.first
copy = original.dup
copy.poster_image.attach = original.poster_image.copy_of_file
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-activestorage

11
推荐指数
6
解决办法
2723
查看次数

如何使用带有Rails Active Storage的S3检索附件URL

rails version 5.2
Run Code Online (Sandbox Code Playgroud)

我有一个场景,我需要使用亚马逊s3访问Rails Active Storage的公共URL来制作带Sidekiq后台作业的zip文件.

我很难获得实际的文件网址.我试过以下

rails_blob_url
Run Code Online (Sandbox Code Playgroud)

但它让我跟随

http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBZUk9IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--9598613be650942d1ee4382a44dad679a80d2d3b/sample.pdf
Run Code Online (Sandbox Code Playgroud)

如何通过sidekiq访问真实文件网址?

storage.yml

 test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

development:
  service: S3
  access_key_id: 'xxxxx'
  secret_access_key: 'xxxxx'
  region: 'xxxxx'
  bucket: 'xxxxx'
Run Code Online (Sandbox Code Playgroud)

development.rb

  config.active_storage.service = :development
Run Code Online (Sandbox Code Playgroud)

我可以在web界面上访问这些,但不能在sidekiq中访问

ruby-on-rails amazon-s3 rails-activestorage

11
推荐指数
3
解决办法
1万
查看次数

如何获取Active Storage映像的URL

我希望通过api获取带有附加图像的记录列表作为链接或文件.

我有一个简单的模型:

class Category < ApplicationRecord
  has_one_attached :image
  validates :name, presence: true, uniqueness: true
end
Run Code Online (Sandbox Code Playgroud)

接下来的行动:

  def index
    @categories = Category.all.with_attached_image

    render json: @categories.to_json(include: { image_attachment: { include: :blob } })
  end
Run Code Online (Sandbox Code Playgroud)

这是我获得图像对象的唯一方法.

我看到下一个结果:

{"id":4,"name":"Cat1","description":""},
{"id":1,"name":"Cat2","description":"","image_attachment":
  {"id":8,"name":"image","record_type":"Category","record_id":1,"blob_id":8,"created_at":"2018-06-09T13:45:40.512Z","blob":
  {"id":8,"key":"3upLhH4vGxZEhhf3TaAjDiCW","filename":"Screen Shot 2018-06-09 at 20.43.24.png","content_type":"image/png","metadata":
  {"identified":true,"width":424,"height":361,"analyzed":true},"byte_size":337347,"checksum":"Y58zbYUVOlZRadx81wxOJA==","created_at":"2018-06-09T13:45:40.482Z"}}},
...
Run Code Online (Sandbox Code Playgroud)

我可以在这里看到文件名.但是文件存在于不同的文件夹中,对我而言,它似乎不是一种获取和链接到文件的便捷方式.

我找不到任何关于此的信息.

更新

根据iGian解决方案,我的代码变为:

  def index
    @categories = Category.all.with_attached_image

    render json: @categories.map { |category|
      category.as_json.merge({ image: url_for(category.image) })
    }
  end
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails ruby-on-rails-5 rails-activestorage

11
推荐指数
2
解决办法
1万
查看次数

发出打开凭据文件的问题

我正在尝试使用此命令打开凭据文件。

rails credentials:edit
Run Code Online (Sandbox Code Playgroud)

它返回:

没有 $EDITOR 来打开文件。像这样分配一个:

EDITOR="mate --wait" bin/rails 凭证:编辑

对于立即 fork 和退出的编辑器,传递一个等待标志很重要,否则凭据将立即保存而没有机会进行编辑。

所以我做了这个命令:

EDITOR="subl --w" bin/rails credentials:edit
Run Code Online (Sandbox Code Playgroud)

但是,终端会在不打开编辑器的情况下以“加密并保存的新凭据”作为响应。

ruby-on-rails amazon-s3 rails-activestorage

11
推荐指数
2
解决办法
6856
查看次数

URI::InvalidURIError(错误的 URI(不是 URI?):nil)Active Storage service_url

配置信息

rails version 6.0
ruby version 2.7.0
gem 'image_processing', '~> 1.2'
Run Code Online (Sandbox Code Playgroud)

存储.yml

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>
Run Code Online (Sandbox Code Playgroud)

发展.rb

config.active_storage.service = :local
Rails.application.routes.default_url_options[:host] = 'localhost:3000'
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
Run Code Online (Sandbox Code Playgroud)

只有当我使用service= :local. 使用 AWS S3 配置,使用:amazon它可以正常工作。

用户.rb模型

  has_one_attached :avatar
  
  #throwing exception
  def avatar_urls
    {
      original: avatar.service_url
    } if avatar.attachment
  end
Run Code Online (Sandbox Code Playgroud)

访问时抛出avatar_urls异常( URI::InvalidURIError (bad URI(is not URI?): nil) )。但是,如果我将avatars_url方法更改为以下方法,则效果很好。

  #working method
  def avatar_urls
    {
      thumbnail: url_for(avatar.variant(resize: "100x100").processed)
    } …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-activestorage ruby-on-rails-6

11
推荐指数
2
解决办法
5081
查看次数