我刚刚转向在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) 我需要获取正在使用的磁盘上的文件的路径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) 有没有办法用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) 将Rails升级到5.2,我发现我必须将storage.yml提交到版本控制中.我不打算使用ActiveStorage.有没有办法禁用它?
我担心新的主动存储功能会出现问题.我想要做的是创建一个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
我有一个带附件的模型:
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)查询一起使用.
我的应用程序部署到 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
我正在尝试学习如何将本地硬盘中的图像附加到 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) 使用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.