在模型中生成图像URL - ActiveStorage

时间:2018-03-28 19:42:23

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

我有一个使用ActiveStorage(Rails 5.2.0.rc2)的简单模型,模型如下所示:

class Vacancy < ApplicationRecord
  has_one_attached :image

  validates_presence_of :title

  def to_builder
    Jbuilder.new do |vacancy|
      vacancy.call(self, :id, :title, :description, :created_at, :updated_at)
      vacancy.image do
        vacancy.url image.attached? ? Rails.application.routes.url_helpers.url_for(image) : nil
      end
    end
  end
end

然后在to_builder方法中,我想要显示图片的永久网址,我正按照导轨指南(http://edgeguides.rubyonrails.org/active_storage_overview.html#linking-to-files)的建议尝试使用Rails.application.routes.url_helpers.url_for(image),但它提出了这个问题错误:

Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

在我的应用程序中,我已经设置了default_url_options[:host]但它不起作用,即使编写url_for(image, host: 'www.example.com')url_for(image, only_path: true)也不起作用,因为它引发了另一个错误:{{1 }}

使用activestorage在模型范围中显示永久URL的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

对模型和控制器中的附件使用方法 try { boolean status; String url = String.format("onedrive.live.com/v1.0/drive/root:/"+step.file_name+":/content"); //exceptions are not coming if i mention https:// in the url. but no output is coming Request request = new Request.Builder() .url(url) .put(RequestBody.create(MediaType.parse(step.getContent_type()),step.getFile_data())) .addHeader("Authorization", String.format("Bearer %s",step.getAccess_token())) .build(); OkHttpClient okHttpClient = new OkHttpClient(); Response response = okHttpClient.newCall(request).execute(); status = response.code()==200 ? true : false; } catch (Exception e) { e.printStackTrace(); return StepStatus.FAILURE; }

例如,如果您需要在模型中创建方法(例如rails_blob_path),则首先应包括cover_url,然后在使用方法url_helpers时添加一些参数。您可以在任何控制器,工作程序等中执行相同的操作。

完整的示例如下:

rails_blob_path

答案 1 :(得分:0)

url_for典型地采用选项哈希值,如果您传入模型,则无法提供host选项:https://apidock.com/rails/ActionView/RoutingUrlFor/url_for

使用指定的路线助手会更容易,例如images_path(image)images_url(image, host: 'your host')

如果您真的想使用url_for,请提供控制器和操作的路径选项:url_for(controller: 'images', action: 'show', id: image.id, host: 'your host')

答案 2 :(得分:0)

调查后我发现的唯一解决方案是使用url_for和@DiegoSalazar建议的选项哈希,然后使用activeresource提供的blobs控制器和正确的参数,ej:< / p>

Rails.application.routes.url_for(controller: 'active_storage/blobs', action: :show, signed_id: image.signed_id, filename: image.filename, host: 'www.example.com')

老实说,我认为在模型范围内访问图像的永久网址应该是一种更简单的方法,但是现在是我找到的唯一解决方案。