标签: rails-activestorage

通过自定义控制器操作将 ActiveStorage 文件发送给用户

我知道 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)

这个错误并说:

无法读取文件

我也尝试过这个: …

ruby-on-rails rails-activestorage

7
推荐指数
2
解决办法
3791
查看次数

使用 Rails Active Storage 渲染 Wicked-PDF 图像

我无法让 wicked_pdf 将图像从活动存储显示为 pdf 文件。我是否使用:wicked_pdf_image_tagwicked_pdf_asset_base64image_tag在 pdf 模板中使用。然后我给一个rails_blob_path(company.logo)或只是company.logo给任何其他方法?

wicked-pdf rails-activestorage ruby-on-rails-5.2

7
推荐指数
1
解决办法
2185
查看次数

你如何解决ActiveStorage URL的N + 1?

你如何用他们的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)

ruby-on-rails rails-activestorage ruby-on-rails-5.2

7
推荐指数
1
解决办法
1334
查看次数

Rails ActiveStorage附加到现有S3文件

我正在构建一个PDF解析器,该解析器将激发Sidekiq工作者以OCR解析S3中存储的文档中的数据。解析后,数据存储在Document模型中。

如何将现有的S3存储桶文件追加到Document.attachment.attachActiveStorage中,而不在S3中复制文件(通过File.open等)?

amazon-s3 rails-activestorage ruby-on-rails-5.2

7
推荐指数
2
解决办法
831
查看次数

如何更改活动存储服务url_expires_in超时?

当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 rails-activestorage

7
推荐指数
1
解决办法
2279
查看次数

Active Storage 永久映像 URL

我正在为一个用 Ruby on Rails 构建的网站创建一个谷歌产品列表。该网站有多个拥有自己前端的商店,因此他们希望每个商店都有一个 Google Product Feed。

我遇到的问题是,如果我使用 url_for(image),那么我会获得该商店中图片的 URL。但主动存储的工作方式是在默认情况下持续 5 分钟的临时 URL 上。因此,链接在已处理的提要上不起作用。

图像托管在 S3 存储桶上,因此我可以获得 service_url。但是 Google 不喜欢将图像从单独的域发送到商店。有没有办法从商店域中获得永久干净的 url?

ruby-on-rails rails-activestorage

7
推荐指数
1
解决办法
4872
查看次数

Errno :: ENOENT:功能测试后没有这样的文件或目录@ rb_file_s_mtime

运行功能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)

Rspec outpout

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给出了相同的错误. …

rspec ruby-on-rails rails-activestorage

7
推荐指数
1
解决办法
1434
查看次数

委托给附件的变体,但附件为零

我正在使用 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)

ruby-on-rails rails-activestorage

7
推荐指数
1
解决办法
5079
查看次数

在 Rails 6 中使用 activestorage 时,如何在重新显示表单时保留文件?

在 Rails 6 中,我有一个带有文件字段的表单,我使用 activestorage 来存储文件。如果提交表单后验证失败,则会重新显示表单,显示验证错误。重新显示表单时如何保留添加到文件字段的文件,以便用户不必再次将文件添加到表单?

rails 5 已经有一个类似的问题:Active Storage: Best practice to retain/cache Uploaded file when form redisplays,但是那里的解决方案只适用于 Rails 5。

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

7
推荐指数
1
解决办法
1842
查看次数

Rails 和 Active Storage,如何直接在创建调用上分配附件?

我有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)

ruby ruby-on-rails rails-activestorage

7
推荐指数
1
解决办法
5271
查看次数