标签: rails-activestorage

如何在rails中使用ActiveStorage正确进行模型测试?

我刚刚转向在rails 5.1.4上使用ActiveStorage而且我是TDD的新手并且正在努力弄清楚如何测试模型 has_one_attached :avatar

require 'rails_helper'

RSpec.describe User, :type => :model do

  let (:valid_user) { FactoryBot.build(:user) }
  describe "Upload avatar" do
    context "with a valid image" do      
      it "saves the image" do
        valid_user.save!        
        saved_file = valid_user.avatar.attach(io: File.open("/home/ubuntu/workspace/spec/fixtures/files/avatar.jpg"), filename: "face.jpg", content_type: "image/jpg")
        expect(saved_file).to be_an_instance_of(ActiveStorage::Attachment::One)
      end
    end
  end 

end
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

Failures:

  1) User Upload avatar with a valid image saves the image
     Failure/Error:
       saved_file = valid_user.avatar.attach(io: File.open("/home/ubuntu/workspace/spec/fixtures/files/avatar.jpg"), filename: "face.jpg", 
                                             content_type: "image/jpg")


 NoMethodError:
   undefined method `upload' for nil:NilClass
   Did you mean?  load
 # …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails rails-activestorage

24
推荐指数
4
解决办法
6345
查看次数

获取磁盘上ActiveStorage文件的路径

我需要获取正在使用的磁盘上的文件的路径ActiveStorage.该文件存储在本地.

当我使用paperclip时,我path在附件上使用了返回完整路径的方法.

例:

user.avatar.path
Run Code Online (Sandbox Code Playgroud)

在查看Active Storage Docs时,它似乎rails_blob_path可以解决问题.在查看它返回的内容之后,它没有提供文档的路径.因此,它返回此错误:

没有这样的文件或目录@ rb_sysopen -

背景

我需要文档的路径,因为我使用的是combine_pdf gem,以便将多个pdf组合成一个pdf.

对于回形针实现,我迭代了所选pdf附件的full_paths,并将load它们组合成合并的pdf:

attachment_paths.each {|att_path| report << CombinePDF.load(att_path)}
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails rails-activestorage

22
推荐指数
4
解决办法
9638
查看次数

ActiveStorage文件附件验证

有没有办法用ActiveStorage验证附件?例如,如果我想验证内容类型或文件大小?

像Paperclip这样的方法会很棒!

  validates_attachment_content_type :logo, content_type: /\Aimage\/.*\Z/
  validates_attachment_size :logo, less_than: 1.megabytes
Run Code Online (Sandbox Code Playgroud)

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

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

在Rails 5.2中禁用活动存储

将Rails升级到5.2,我发现我必须将storage.yml提交到版本控制中.我不打算使用ActiveStorage.有没有办法禁用它?

rails-activestorage ruby-on-rails-5.2

20
推荐指数
2
解决办法
6334
查看次数

升级到 rails 6.1.0 后 ActiveStorage::Blob 的未定义方法“service_name”

我将我的应用程序从 6.0.3.4 升级到 6.1.0 并收到此错误消息。查了一下,没有发现任何东西。

我有一个非常基本的 ActiveStorage 用法

错误信息

ruby-on-rails rails-activestorage

20
推荐指数
1
解决办法
1814
查看次数

使用Rails 5.2 ActiveStorage创建和保存pdf,然后附加到电子邮件

我担心新的主动存储功能会出现问题.我想要做的是创建一个pdf(我正在使用WickedPdf)并将其附加到模型.这是第一个问题,我到目前为止唯一的想法是首先写入文件,然后打开此文件以创建附件.

self.document.attach( {
  filename: "filename.pdf",
  io: File.open(pdf_document)
})
Run Code Online (Sandbox Code Playgroud)

有没有办法从字符串创建附件?

之后我尝试将此文件附加到邮件中.这会失败,因为它需要一个文件,而不是一个blob.

attachments[document.filename.to_s] = document.blob
Run Code Online (Sandbox Code Playgroud)

再次创建一个文件对我来说似乎很奇怪.

可以请有人告诉我,如果没有编写文件,那么实现这一目标的正确方法是什么?对我来说,这似乎是不必要的,无用的和耗时的.

=====

解决方案第2部分:所以我设法在不创建文件的情况下附加文档

attachments[document.filename.to_s] = {:mime_type => 'application/pdf',
                               :content => document.attachment.blob.download }
Run Code Online (Sandbox Code Playgroud)

第一部分仍然缺失.希望有人有答案!

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

19
推荐指数
1
解决办法
3899
查看次数

Rails 5.2 Active Storage添加自定义属性

我有一个带附件的模型:

class Project < ApplicationRecord
  has_many_attached :images
end
Run Code Online (Sandbox Code Playgroud)

当我附加并保存图像时,我还想保存附加图像的附加自定义属性 - display_order(整数).我想用它来对附加的图像进行排序,并按照我在此自定义属性中指定的顺序显示它们.我已经查看了#attach方法和ActiveStorage::Blob模型的ActiveStorage源代码,但看起来没有内置方法来传递一些自定义元数据.

我想知道,使用ActiveStorage解决这个问题的惯用方法是什么?在过去,我通常只会display_order在ActiveRecord模型中添加一个属性来表示我的附件,然后将其与.order(display_order: :asc)查询一起使用.

ruby ruby-on-rails rails-activestorage

18
推荐指数
1
解决办法
4431
查看次数

Heroku:在 /app/config/storage.yml 中找不到 Active Storage 配置(运行时错误)

我的应用程序部署到 Heroku,但每次都崩溃。我不知道为什么。我已经在 Heroku 上为生产中的应用程序设置了 Carrierwave、雾和 aws,然后就好了。尝试按照相同的步骤操作,但我收到了 h10 错误代码。在 rails 控制台中,它特别指出:

/app/vendor/bundle/ruby/2.3.0/gems/activestorage-5.2.1/lib/active_storage/engine.rb:76:in `block (2 levels) in ': 找不到 Active Storage 配置 / app/config/storage.yml(运行时错误)

storage.yml 

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

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


# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
# amazon:
amazon:
  service: S3
  access_key_id: "S3_KEY"
  secret_access_key: "S3_SECRET"
  region: "us-east-1"
  bucket: "books4reviews"
Run Code Online (Sandbox Code Playgroud)

生产.rb

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

载波

CarrierWave.configure do |config|

config.fog_provider = 'fog/aws'

config.fog_credentials = {
  provider: 'AWS',
  aws_access_key_id: ENV['S3_KEY'],
  aws_secret_access_key: …
Run Code Online (Sandbox Code Playgroud)

crash ruby-on-rails heroku amazon-web-services rails-activestorage

15
推荐指数
2
解决办法
3169
查看次数

如何从 Rails 控制台附加本地硬盘的 Active Storage 映像?

我正在尝试学习如何将本地硬盘中的图像附加到 Active Storage。例如

User.last.images.attach("../../Downloads/me.jpg")
Run Code Online (Sandbox Code Playgroud)

但我看到

ActiveSupport::MessageVerifier::InvalidSignature: ActiveSupport::MessageVerifier::InvalidSignature
from /Users/st/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.2/lib/active_support/message_verifier.rb:176:in `verify'
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-activestorage

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

使用设计保护活动存储

使用devise gem验证应用程序的所有用户.我正在尝试实现Active Storage.

假设所有用户一旦到达应用程序就必须进行身份验证:

class ApplicationController < ActionController::Base
  before_action :authenticate_user!

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

如何保护Active Storage生成的路由?

无需先进行身份验证即可访问上载文件的URL.未经身份验证的用户可以获取Active Storage生成的文件URL.

ruby-on-rails rails-activestorage

12
推荐指数
2
解决办法
2246
查看次数