我正在切换到Rails Active Storage来为产品目录本地处理(使用磁盘服务)图像的上载和存储,并且在获取图像的可用URL以馈入{{1 }} 标签。我在前端使用React,所以我不能(轻松)使用Rails助手来生成标签。
ActiveStorage将文件放入<img>
中。我可以对与文件(例如/public/images
)的相对链接进行硬编码,并且可以正常工作。
http://localhost:3000/images/Ab/CD/AbCDEfGhIjkL
中的相关代码段:
Product.rb
class Product < ApplicationRecord
attr_accessor :image_url
has_one_attached :image
def as_json(options)
h = super(options)
if self.image.attached?
h[:image_url] = ActiveStorage::Blob.service.service_url(self.image.key)
end
h
end
end
生成一个JSON对象以馈送到React,该对象具有用于as_json
的{{1}}属性的条目image_url
。使用上面的代码,<img>
包含文件的完整路径(即src
)。在视图中使用image_url
会产生相同的结果。我希望它只包含相对于rails root的路径。
我可以操作该字符串以删除相对路径之前的所有内容,但是我预见,如果将来发生任何更改,这会在将来导致错误,因此,我宁愿找到一种方法来使ActiveStorage只是为我生成一个合适的字符串。
谢谢!
答案 0 :(得分:1)
您需要使用路由助手来构建指向Rails应用程序的URL。
https://guides.rubyonrails.org/active_storage_overview.html#linking-to-files
class Product < ApplicationRecord
attr_accessor :image_url
has_one_attached :image
def as_json(options)
h = super(options)
if self.image.attached?
h[:image_url] = Rails.application.routes.url_helpers.rails_blob_path(self.image)
end
h
end
end