我将ActiveStorage用于用户生成的样式表,这些样式表将被上载到s3,以便将其包含在自定义的用户样式网页中。
所以我有一个CustomeTheme模型
has_one_attached :style, dependent: :purge_later
和一个after_save回调,该回调在保存自定义样式后进行上传
self.style.attach(io: File.open(File.join(asset_path, name)), filename: name, content_type: 'text/css')
包含在布局中
= stylesheet_link_tag url_for(@custom_theme.style)
现在的问题是,由于上载到s3尚未完成,因此用户保存了样式并看到了自定义网页的预览,但没有自定义样式(此时为404),至少我想。
to_model delegated to attachment, but attachment is nil
/usr/local/bundle/gems/activesupport-5.2.1/lib/active_support/core_ext/module/delegation.rb:278:in `rescue in method_missing'
/usr/local/bundle/gems/activesupport-5.2.1/lib/active_support/core_ext/module/delegation.rb:274:in `method_missing'
/usr/local/bundle/gems/actionpack-5.2.1/lib/action_dispatch/routing/polymorphic_routes.rb:265:in `handle_model'
/usr/local/bundle/gems/actionpack-5.2.1/lib/action_dispatch/routing/polymorphic_routes.rb:280:in `handle_model_call'
/usr/local/bundle/gems/actionview-5.2.1/lib/action_view/routing_url_for.rb:117:in `url_for'
所以我仍然不清楚这个问题,我怎么知道该资产(无论是样式还是图像)都可以显示了?
答案 0 :(得分:0)
2种可能的方法:
定义用于检查上传状态的路由,然后在Javascript中运行一个间隔以检查给定上传ID的上传状态。完成后,端点将返回资产URL,然后您可以使用该URL。 (例如,如果资产是图像,则只需将其放在<img>
标签src
属性上)。
另一种方法类似于Delayed Paperclip所做的事情:
在默认设置中,当您首次上载图像并尝试在作业完成之前显示它时,Paperclip不会更明智,并输出尚未处理的图像的url,将导致页面上显示的图像链接损坏。
要在处理图像时通过回形针输出丢失的图像URL,您要做的就是向要启用此功能的特定模型添加#{attachment_name} _processing列。
class AddAvatarProcessingToUser < ActiveRecord::Migration
def self.up
add_column :users, :avatar_processing, :boolean
end
def self.down
remove_column :users, :avatar_processing
end
end
@user = User.new(avatar: File.new(...))
@user.save
@user.avatar.url #=> "/images/original/missing.png"
# Process job
@user.reload
@user.avatar.url #=> "/system/images/3/original/IMG_2772.JPG?1267562148"