我知道 ActiveStorageurl_for(user.avatar)方法。例子:
<%= link_to "Download this file", url_for(@user.avatar) %>
Run Code Online (Sandbox Code Playgroud)
这很好,但它似乎没有围绕它建立授权。任何知道此链接的人都可以下载此文档。
过去,当我使用paperclip 时,我有一个指向自定义控制器操作的链接。该自定义控制器操作进行了授权,如果一切顺利,那么我曾经send_file将文件发送给用户。它是这样的:
def deliver_the_file
authorize :my_authorization
send_file @user.avatar.path
end
Run Code Online (Sandbox Code Playgroud)
我怎样才能用 active_storage 做到这一点?我所做的只是url_for实现根本不授权用户。
我正在专门查看 ActiveStorage 上 Rails 指南的下载文件部分。
相关示例代码:
# model
class Book < ApplicationRecord
has_one_attached :book_cover
end
class BooksController < ApplicationController
...
# custom action to authorize and then deliver the active_storage file
def deliver_it
# ... assume authorization already happened
send_file rails_blob_path(@book.book_cover, disposition: "attachment")
end
end
Run Code Online (Sandbox Code Playgroud)
这个错误并说:
无法读取文件
我也尝试过这个: …
我无法让 wicked_pdf 将图像从活动存储显示为 pdf 文件。我是否使用:wicked_pdf_image_tag或 wicked_pdf_asset_base64仅image_tag在 pdf 模板中使用。然后我给一个rails_blob_path(company.logo)或只是company.logo给任何其他方法?
你如何用他们的URL预加载所有记录?
这是我在jbuilder中为获取URL而做的事情:
# views/users/index.json.jbuilder
...
json.avatar_url user.avatar.attached? && rails_blob_url(user.avatar)
...
Comment
has_one :user
User
has_one_attached :avatar
Run Code Online (Sandbox Code Playgroud)
你会如何预加载所有用户及其头像?
Comments.includes(users: :avatar)
Run Code Online (Sandbox Code Playgroud)
产生以下错误:
ActiveRecord :: AssociationNotFoundError(在用户上找不到名为'avatar'的关联;也许你拼错了吗?)
执行时弹出相同的错误:
User.includes(:avatar)
Run Code Online (Sandbox Code Playgroud) 我正在构建一个PDF解析器,该解析器将激发Sidekiq工作者以OCR解析S3中存储的文档中的数据。解析后,数据存储在Document模型中。
如何将现有的S3存储桶文件追加到Document.attachment.attachActiveStorage中,而不在S3中复制文件(通过File.open等)?
当Active Storage创建签名的变体URL时,它会将默认超时设置为5.minutes.我真的想增加这个,但我一直在拖网Github问题,代码潜水,无法在任何地方找到它.在服务类a的第44行class_attribute设置,但是如何覆盖它?
https://github.com/rails/rails/blob/5-2-stable/activestorage/lib/active_storage/service.rb#L44
我正在使用url_for生成已签名的变体链接,但似乎无论如何都不会改变设置.任何帮助将不胜感激.
谢谢!:)
我正在为一个用 Ruby on Rails 构建的网站创建一个谷歌产品列表。该网站有多个拥有自己前端的商店,因此他们希望每个商店都有一个 Google Product Feed。
我遇到的问题是,如果我使用 url_for(image),那么我会获得该商店中图片的 URL。但主动存储的工作方式是在默认情况下持续 5 分钟的临时 URL 上。因此,链接在已处理的提要上不起作用。
图像托管在 S3 存储桶上,因此我可以获得 service_url。但是 Google 不喜欢将图像从单独的域发送到商店。有没有办法从商店域中获得永久干净的 url?
运行功能Rspecs时,我收到以下错误(此消息底部的完整跟踪)
Rack app error handling request { GET /rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSm5kbUZ5YVdGdWRITXZSM0IxTkRGRFRWQlFaVXRNYVUxaVpuQjZXVmw1UTNBMUx6RXhNR1V3TVRka01UWTVNalZrWXpkak5UQTNNamhqT1dNeE5UUmhOREl3TURjNVlXRTJaVFZtWTJNME16VmtZak5sTm1VNU4ySXhNemd3WldObFl6Z0dPZ1pGVkRvUVpHbHpjRzl6YVhScGIyNUpJajFwYm14cGJtVTdJR1pwYkdWdVlXMWxQU0pwYldGblpTNXdibWNpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjJsdFlXZGxMbkJ1WndZN0JsUTZFV052Ym5SbGJuUmZkSGx3WlVraURtbHRZV2RsTDNCdVp3WTdCbFE9IiwiZXhwIjoiMjAxOS0wMS0yNVQxMToxNjoyOS40NDBaIiwicHVyIjoiYmxvYl9rZXkifX0=--db9451afdc95b292aa6a77c40e00ab0ceb687766/image.png }
#<Errno::ENOENT: No such file or directory @ rb_file_s_mtime - /path/to/rails/app/tmp/storage/va/ri/variants/Gpu41CMPPeKLiMbfpzYYyCp5/110e017d16925dc7c50728c9c154a420079aa6e5fcc435db3e6e97b1380ecec8>
(followed by the full trace at the end of this message)
Run Code Online (Sandbox Code Playgroud)
Failure/Error: last_modified = ::File.mtime(path).httpdate
Errno::ENOENT:
No such file or directory @ rb_file_s_mtime - /path/to/rails/app/tmp/storage/va/ri/variants/Gpu41CMPPeKLiMbfpzYYyCp5/110e017d16925dc7c50728c9c154a420079aa6e5fcc435db3e6e97b1380ecec8
(followed by the full trace at the end of this message)
Run Code Online (Sandbox Code Playgroud)
product.image是一个ActiveStorage附件.在测试期间,"products/_form"部分被渲染并显示附件文件(即png图像),其代码如下:= image_tag url_for(product.image.variant(resize: "120x120")).如果我注释掉这一行,则不再出现错误.
测试本身每次都会成功,测试后似乎会触发错误.我验证了所有的after块,它似乎发生在我所有的后块之后.
跟踪表明ActiveStorage::DiskController.serve_file触发了错误.是不是ActiveStorage应用程序没有正常关闭?
我正在使用active_storage.service = :test配置,但:file给出了相同的错误. …
我正在使用 ActiveStorage 开发 Rails 6 应用程序。我正在使用 devise 进行身份验证,这需要在 sign_up 页面上提供电子邮件和密码。成功注册后,我想重定向到编辑个人资料。用户不一定需要上传头像或其他一些字段。如果这是用户的选择,这些可以留空。
ActionView::Template::Error (variant delegated to attachment, but attachment is nil):
3:
4: <p><%= @user.full_name %><p>
5: <p>
6: <%= image_tag @user.avatar.variant(resize_to_limit: [100, 100])%>
7: <p>
8: <p><%= @user.city %><p>
9: <p><%= @user.bio %><p>
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,但我希望这些字段是可选的,我该如何实现?用户/edit.html.erb
<%= form_for @user do |f| %>
<div class="form-group">
<%= f.label :avatar %>
<%= f.file_field :avatar, as: :file, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :full_name, 'Full Name' %>
<%= f.text_field :full_name, autofocus: true, class: "form-control" %> …Run Code Online (Sandbox Code Playgroud) 在 Rails 6 中,我有一个带有文件字段的表单,我使用 activestorage 来存储文件。如果提交表单后验证失败,则会重新显示表单,显示验证错误。重新显示表单时如何保留添加到文件字段的文件,以便用户不必再次将文件添加到表单?
rails 5 已经有一个类似的问题:Active Storage: Best practice to retain/cache Uploaded file when form redisplays,但是那里的解决方案只适用于 Rails 5。
我有MyModel:
has_one_attached :video
Run Code Online (Sandbox Code Playgroud)
我发现我可以这样做:
my_model = MyModel.create!()
my_model.video.attach(io: File.open("path/my_video.webm"), filename: "video.webm")
Run Code Online (Sandbox Code Playgroud)
并且它工作正常。
但我想知道是否有一种方法可以将附件分配到调用中,create()例如:
MyModel.create!(
video: File.read("path/my_video.webm")
)
Run Code Online (Sandbox Code Playgroud)
如果我执行上述操作,我会看到此错误:
/.rbenv/versions/3.0.2/lib/ruby/gems/3.0.0/gems/activesupport-6.1.4.1/lib/active_support/message_verifier.rb:176:in `verify': ActiveSupport::MessageVerifier::InvalidSignature (ActiveSupport::MessageVerifier::InvalidSignature)
我试过这个:
MyModel.create!(
video: File.open("path/my_video.webm")
)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
/.rbenv/versions/3.0.2/lib/ruby/gems/3.0.0/gems/activestorage-6.1.4.1/lib/active_storage/attached/changes/create_one.rb:74:在`find_or_build_blob'中:找不到或构建blob:预期可附加,得到#File:/Users/fernando.guillen/Development/PlaycocolaBackend/test/fixtures/files/video.webm(ArgumentError)