首页 文章

如何将我的附件的url存储在rails控制器的活动存储中

提问于
浏览
4

如何在我的rails控制器中获取存储在活动存储中的has_one模型附件的URL . 所以,我可以在json中将其作为api的完整链接发送 . 到目前为止,我尝试了以下方法,但每个方法都提出了各种问题:

1)current_user.image.service_url ----未定义的方法`service_url'for#

2)Rails.application.routes.url_helpers.rails_disk_blob_path(current_user.image,only_path:true),它给我一个输出,如:

"/rails/blobs/%23%3CActiveStorage::Attached::One:0x007f991c7b41b8%3E"

但这不是网址,对吗?我无法在浏览器上点击并获取图像 .

3)url_for ----

undefined method `active_storage_attachment_url' for #<Api::V1::UsersController:0x007f991c1eaa98

4 回答

  • 1

    我没有使用rails活动存储,但我在文档中读到的这可能对你有帮助

    试试 rails_blob_url(model.image)

    更多http://edgeguides.rubyonrails.org/active_storage_overview.html

  • 1

    对控制器和模型中的附件使用rails_blob_path方法

    例如,如果您需要在控制器中分配变量(例如 cover_url ),首先应该包含 url_helpers ,并在使用方法 rails_blob_path 后添加一些参数 . 您可以在任何模型, Worker 等中执行相同的操作 .

    完整示例如下:

    class ApplicationController < ActionController::Base
    
      include Rails.application.routes.url_helpers
    
      def index
        @event = Event.first
        cover_url = rails_blob_path(@event.cover, disposition: "attachment", only_path: true)
      end
    
    end
    
  • 2

    有时,例如API需要为客户端(例如移动电话等)返回具有主机/协议的完整URL . 在这种情况下,将host参数传递给所有rails_blob_url调用是重复的而不是DRY . 甚至,您可能需要在dev / test / prod中使用不同的设置才能使其正常工作 .

    如果您正在使用ActionMailer并且已在环境/ * .rb中配置该主机/协议,则可以使用 rails_blob_urlrails_representation_url 重用该设置 .

    # in your config/environments/*.rb you might be already configuring ActionMailer
    config.action_mailer.default_url_options = { host: 'www.my-site.com', protocol: 'https' }
    

    我建议只调用完整的 Rails.application.url_helpers.rails_blob_url 而不是将至少50种方法转储到模型类中(取决于你的routes.rb),当你只需要2时 .

    class MyModel < ApplicationModel
      has_one_attached :logo
    
      # linking to a variant full url
      def logo_medium_variant_url
        variant = logo.variant(resize: "1600x200>")   
        Rails.application.routes.url_helpers.rails_representation_url(
          variant, 
          Rails.application.config.action_mailer.default_url_options
        )
       end
    
      # linking to a original blob full url
      def logo_blob_url
        Rails.application.routes.url_helpers.rails_blob_url(
          logo.blob, 
          Rails.application.config.action_mailer.default_url_options
        )
      end
    end
    
  • 0

    我能够使用以下内容在浏览器中查看图像:

    <%= link_to image_tag(upload.variant(resize: "100x100")), upload %>
    

    其中 upload 是附加图像 .

相关问题