我计划在我的一个网站上将Rails升级到5.2并引入ActiveStorage,截至目前我使用Paperclip和paperclip_optimizer.其中一个不利的方面是,当用ActiveStorage替换回形针时,我将丢失优化器.如何在ActiveStorage中实现用户上传的自动图像优化?
我想使用Rails作为移动应用程序(Android和iOS)的后端,其中一个要求是文件上传.
我无法通过这种方式直接上传使用Activestorage找到任何资源 - 有没有人有示例或提示?
另一种选择 - 我认为 - 是对activestorage.js进行反向工程,并完成其所做的工作.但也许我不是第一个有这种需求的人......
我想知道 ActiveRecord 模型对象上的图像是否已更改,以便我可以执行其他功能,但看不到任何可用的信息。
IE
object.image.changed? or object.image_changed? or object.changed?
Run Code Online (Sandbox Code Playgroud) 我们可以更改从活动存储创建的默认“永久”url 以重定向到 S3。类似于 rails/active_storage/representations/。我不喜欢 url 中的框架名称。
谢谢
我正在使用 rails 5.2 并且我正在尝试使用 Amazon S3 设置 Active Storage。我的应用程序可以完全访问 S3,并且可以将avatar图像附加到user. 但是当我尝试删除头像时,我遇到了以下问题:
> user.avatar.attached? #true`
> user.avatar.purge
S3 Storage (697.9ms) Deleted file from key: Ns1KBRzdgxLNnY31sH72vT5t
S3 Storage (227.0ms) Deleted files by key prefix: variants/Ns1KBRzdgxLNnY31sH72vT5t/
Aws::S3::Errors::AccessDenied: Access Denied
Run Code Online (Sandbox Code Playgroud)
然后,当我检查存储桶时,该文件实际上已被删除,但在数据库中查找Blob和Attachment记录仍然存在。
任何想法为什么会发生这种情况?
编辑 我按照接受的答案的建议对我的 IAM 权限进行了一些更新。这些是我更新的项目:
最后我的策略 json 看起来像这样:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::my-bucket/*", …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要模型ActiveStorage has_many_attached :photos情况的项目Location.
我在下面设置了代码,但在尝试上传表单时,收到以下错误:
ActiveSupport::MessageVerifier::InvalidSignature in
LocationsController#attach_photo
Run Code Online (Sandbox Code Playgroud)
这是将文件"添加"到特定父记录(即:Location记录)的附件集的方法吗?
Location 模型class Location < ApplicationRecord
...
has_many_attached :photos
...
end
Run Code Online (Sandbox Code Playgroud)
class LocationsController < ApplicationController
...
def attach_photo
@location = Location.find(params[:id])
@location.photos.attach(params[:photo])
redirect_to location_path(@location)
end
...
end
Run Code Online (Sandbox Code Playgroud)
<%= form_tag attach_photo_location_path(@location) do %>
<%= label_tag :photo %>
<%= file_field_tag :photo %>
<%= submit_tag "Upload" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
resources :locations do
member do
post :attach_photo
end
end
Run Code Online (Sandbox Code Playgroud) 我想向ActiveStorage添加自定义服务,因为我想覆盖ActiveStorage :: Service :: S3Service服务的url方法,以便可以在S3存储桶前面使用CloudFront CDN。我想我不需要参数,只需要键,因为CloudFront实例将具有对S3存储桶的完全读取权限。presigned_url
我试图简单地显示附加到我的用户模型的图像的 URL。
def show
render json: @user, include: [:images]
end
Run Code Online (Sandbox Code Playgroud)
上面的回复给了我:-
{
"id": 2288,
"name": "Joe Bloggs",
"images": [
{
"id": 1,
"name": "images",
"record_type": "User",
"record_id": 2288,
"blob_id": 1,
"created_at": "2021-04-20T13:53:16.663Z"
}
]
}
Run Code Online (Sandbox Code Playgroud)
从 Rails API 文档和其他 stackoverflow 帖子中,我应该使用如下所示的service_urlor方法:-url
def show
render json: @user, include: [images: {methods: :service_url}]
end
Run Code Online (Sandbox Code Playgroud)
然而,上面的内容给了我:-
"status": 500,
"error": "Internal Server Error",
"exception": "#<URI::InvalidURIError: bad URI(is not URI?): nil>",
Run Code Online (Sandbox Code Playgroud)
我如何在这里实现我想要的?
我还使用 binding.pry 尝试手动获取路径
@user.images.first.url
@user.images.first.blob
@user.images.first.blob.url
@user.images.first.blob.service_url
Run Code Online (Sandbox Code Playgroud)
以上每一项都给了我:-
NameError: uninitialized constant …Run Code Online (Sandbox Code Playgroud) 我有:
设置 Rails 项目
添加了活动管理员。
设置 Active Storage,更新配置以进行本地连接并执行以下操作:
bin/rails active_storage:安装
bin/rails db:migrate
然后,当尝试建立一个Document带有附加文件的非常简单的模型时:
class Document < ApplicationRecord
has_one_attached :file
end
Run Code Online (Sandbox Code Playgroud)
最简单的活动管理页面可能是这样的:
ActiveAdmin.register Document do
permit_params :name, :type, :file
end
Run Code Online (Sandbox Code Playgroud)
我在尝试访问该页面时收到以下错误:
Rails 找不到 ActiveStorage::Blob 关联的有效模型。请在关联声明中提供 :class_name 选项。如果 :class_name 已提供,请确保它是 ActiveRecord::Base 子类。
我不确定出了什么问题。从文档看来,迁移并将该行添加到模型后一切都应该正常工作。
Ruby 版本:“3.1.1”
Rails 版本:“7.0.2”
我有一个 Rails 模型:
has_many_attached :files
Run Code Online (Sandbox Code Playgroud)
默认情况下,通过 Active Storage 上传时,如果您上传新文件,它会删除所有现有上传内容并将其替换为新文件。
我有一个控制器破解,由于多种原因,它不太理想:
在 Rails 6 中使用 has_many_attached 更新图像的正确方法是什么
有没有办法配置 Active Storage 以保留现有的存储?