Rails Active Storage:获取附件的相对磁盘服务路径

时间:2019-04-28 02:11:52

标签: ruby-on-rails ruby reactjs rails-activestorage

我正在切换到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只是为我生成一个合适的字符串。

谢谢!

1 个答案:

答案 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