所以我使用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) 我有一个基本的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 Active Storage 可以在没有模型支持的情况下使用吗?我有一个表格,需要上传文件,但我不希望将其附加到模型中。我只需要上传文件,以便我可以使用后台作业处理它,然后将其删除。
我使用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)
有人可以帮忙吗?
有谁知道是否有办法为特定附件配置自定义存储桶?
class MyModel < ApplicationRecord
...
has_one_attached :logo, bucket: 'custom_bucket'
...
end
Run Code Online (Sandbox Code Playgroud) 我有一个使用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) 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中访问
我希望通过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) 我正在尝试使用此命令打开凭据文件。
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)
但是,终端会在不打开编辑器的情况下以“加密并保存的新凭据”作为响应。
配置信息
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)