【问题标题】:ActiveStorage - Get variant URL in modelActiveStorage - 获取模型中的变体 URL
【发布时间】:2019-06-05 07:45:52
【问题描述】:

我正在将我的 Rails 应用程序从使用 PaperClip 迁移到 ActiveStorage。

在我的一个模型中,我有以下方法(使用回形针):

class ECard < ActiveRecord
    def thumb_url
        self.attachment.url(:thumb)
    end
end

在控制器中我有:

def by_type
    @e_cards = ECard.where(type_id: params[:type_id]).as_json(:only => [:id, :name], :methods => [:thumb_url])
    respond_to do |format|
        format.json { render json: @e_cards }
    end   
end

现在,我正在使用 ActiveStorage,如何从 thumb_url 方法中获取附件的缩略图 url?

作品Rails.application.routes.url_helpers.rails_blob_path(attachment, only_path: true)

不起作用Rails.application.routes.url_helpers.rails_blob_path(attachment.variant(resize: '200x200'), only_path: true) 这会引发错误:NoMethodError (undefined method 'signed_id' for #&lt;ActiveStorage::Variant:0x00007fac1960eab0&gt;)

我如何做到这一点?

【问题讨论】:

    标签: ruby-on-rails rails-activestorage


    【解决方案1】:

    找到了!

    def thumb_url 
        Rails.application.routes.url_helpers.rails_representation_url(attachment.variant(resize: "200x200").processed, only_path: true)
    end
    

    this answer找到。

    【讨论】:

    • 这种“hack”是一种代码味道(很难做到,因为 url 与视图更相关,不属于模型,而是属于您正在渲染的视图)。您可以使用 json 视图,而不是使用 as_jsonas_json 在某些情况下很好,但感觉有时使用视图更干净。
    • @arieljuod。谢谢你。我的直觉是,由于很难找到答案,可能是因为模型应该与附件和 URL 没有任何关系。我将修改代码以返回 json 视图。
    • @mridula 谢谢。您是否在带有as_json 的模型/控制器中提供了新解决方案的完整示例?您的代码中的attachment 是什么?多文件解决方案的def 是否相同?
    • @laimison,对不起!我不再从事那个项目,我不记得我的解决方案了。
    • @mridula 没有问题,以不同的方式对此进行了排序。实际上,我更感兴趣的是在控制器中看到这个 URL。然后我可以将 URL 添加到前端的 GET 响应中。
    【解决方案2】:

    attachment.variant(resize: "200x200").service.url 适合我。它在使用 S3 时为您提供外部 url,而不是您的应用程序的内部链接。

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2012-03-04
      • 2022-10-19
      • 2019-10-13
      相关资源
      最近更新 更多