ruby-on-rails 未定义方法“asset_data_uri”- Rail 3.2

xbp102n0  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(124)

我有一个部分的“person.css.erb”:

#caption {
   background-image: url(<%= asset_data_uri("caption.png") %>); 
   text-align: center;
 }

字符串
当渲染部分时,它会失败,并且:

undefined method `asset_data_uri'


Rails资产管道指南中有一个使用此方法的示例:http://guides.rubyonrails.org/asset_pipeline.html
类似的帮助器也可以工作,例如asset_path。我使用的是Rails 3.2.8。指南过时了吗?方法被重命名了吗?我需要做一些特殊的事情来包含这个帮助器吗?

kuuvgm7e

kuuvgm7e1#

我在我的视图中使用asset_data_uri时遇到了同样的错误(asset_path工作),并且无法找出原因。这不完全是你的问题,但我能够通过将此添加到我的application_helper.rb来修复我的问题:

# Copied from Sprockets::Context.asset_data_uri, and slightly modified.
def asset_data_uri path
  asset = Rails.application.assets.find_asset path

  throw "Could not find asset '#{path}'" if asset.nil?

  base64 = Base64.encode64(asset.to_s).gsub(/\s+/, "")
  "data:#{asset.content_type};base64,#{Rack::Utils.escape(base64)}"
end

字符串

nwlls2ji

nwlls2ji2#

最近(Rails 7.1.2和ruby 3.2.2.),我也在尝试为资产管道之外的图像生成data_uri。Tim的回答是一个很好的开始,但我花了一段时间才完全工作。以下是我在这一过程中沿着学到的一些东西:
1.可以使用Base64.strct_encode64来避免gsub删除空格
1.如果使用ActiveStorage,则使用.download获取原始位(而不是.to_s
1.我不认为有必要转义base64字符串。在我的情况下,转义字符串在Safari和Chromium中工作,但当我试图将转义的图像上传到Salesforce时,我从他们的REST API中获得INVALID_DATA_URI错误。
对我来说最终的结果是:

def image_as_data_uri
    base64 = Base64.strict_encode64(image.download)
    data_uri_string = "data:#{image.content_type};base64,#{base64}"
    "<img src=\"#{data_uri_string}\">"
  end

字符串
如果你想使用ActiveStorage变量(默认为:thumb大小的变量),它可能看起来像这样:

class User < ApplicationRecord
  has_one_attached :image do |attachable|
    attachable.variant :thumb, resize_to_fill: [99, 132], preprocessed: true
    attachable.variant :full, resize_to_fill: [990, 1320], preprocessed: true
  end

  # <snip>

  def image_as_data_uri(variant=:thumb)
    base64 = Base64.strict_encode64(image.variant(variant).download)
    data_uri_string = "data:#{image.variant(variant).content_type};base64,#{base64}"
    "<img src=\"#{data_uri_string}\">"
  end
end


与最初的问题无关(但与为什么接受的答案对我不起作用有关),下面是我如何在后台作业中使用上述方法使用Restforce gem更新Salesforce富文本字段(为简洁起见,省略了错误检查代码),选择:full变体:

class SyncPhotoJob < ApplicationJob
  queue_as :default

  def perform(user)
    client = Restforce.new(instance_url: ENV['INSTANCE_URL'])
    client.update!(
      'Contact',
      Id: user.sf_contact_id,
      MTC_Photo__c: user.image_as_data_uri(:full)
    )
  end

end

相关问题