【问题标题】:How do I get an absolute URL for an asset in Rails 3.1?如何获取 Rails 3.1 中资产的绝对 URL?
【发布时间】:2011-09-23 21:48:55
【问题描述】:

image_path 仅返回路径(无主机)。

url_for 帮助器不会接受单一路径,所以像 url_for(image_path('image.png')) 这样的东西不起作用。虽然ActionDispatch::Http::Url.url_for 中的内部url_for 似乎可以解决问题(source),但它似乎没有公共接口。

我应该怎么做呢?最终,最好有一个像 image_url 这样的函数,它像 url_for 那样对路由起作用,这样我就可以调用 image_url('image.png') 并在给定所有 default_url_options 的情况下获取绝对 URL。

【问题讨论】:

  • 这个博客有一个可以使用的sn-p:stick.gk2.sk/blog/2009/12/image_url-function-in-ruby-on-rails
  • @Spike:这种方法的缺点是它忽略了默认的 url 选项。例如,无法手动或通过应用配置中的 default_url_options 哈希来覆盖推断的请求参数。
  • @SpikeGronim 这不适用于延迟作业,因为请求将为空
  • 对于 Rails ~> 4.2.1,使用:host 选项的asset_url 和朋友,例如asset_url('my_image.png', host: root_url)。见asset_url docs

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:
def image_url(source)
  URI.join(root_url, image_path(source))
end

通过这种方式,您可以使用assets_host 或使用root_url 连接来获取url。

【讨论】:

  • 有关信息,您必须将add_template_helper(MailerHelper) 添加到邮件中,以使助手在 3.2 中工作
  • @Syl 为什么选择 MailerHelper?这是关于资产而不是邮寄
【解决方案2】:

在您的 application_helper.rb 中试试这个(来自 Spike 列出的页面上的一个 cmets):

def image_url(source)
  "#{root_url}#{image_path(source)}"
end

【讨论】:

  • 删除多余的斜线:def image_url(source) "#{root_url[0...-1]}#{image_path(source)}" end
  • 我在 Rails 3.1 中使用它时遇到了麻烦,直到我将名称更改为 url_for_image。我不确定,但我认为 image_url 方法正在寻找作为路线。
  • 我还必须将 image_url 方法名称更改为 get_image_url 才能使其正常工作。
【解决方案3】:

我们的生产和暂存资产位于 s3/cloudfront... 但不是本地/dev。所以我写了这个(可能有点矫枉过正,可能可以简化):

  def get_digest_file(source)
     return asset_path(source.to_s.downcase) unless Rails.application.config.assets.digests.present?
     return ActionController::Base.asset_host + "/assets/" + Rails.application.config.assets.digests[source.to_s.downcase]
  end

【讨论】:

  • 如果使用涡轮链轮,这个答案会略有不同,顺便说一句。
【解决方案4】:

最近看来,sass-rails 现在以预期的方式解释 scss 文件中的 image_url 命令,解析到相关图像的最终位置。

【讨论】:

  • 在 Sass 之外有什么方法可以做到这一点? image_url 在视图中不起作用。
  • 是的。这是我以前使用过的地方(内联样式):"background:url(#{asset_path('desktop-header@2x.jpg')}) top center no-repeat;"
【解决方案5】:

来自Full url for an image-path in Rails 3

request.protocol + request.host_with_port + image_path('image.png')

你甚至可以创建一个助手来干燥它,比如

def full_image_path(img_path)
    request.protocol + request.host_with_port + image_path(img_path)
end

【讨论】:

    【解决方案6】:

    您可以为任何背景图像或其他资产定义带有绝对 url 的 css。所以你可以按照这个How to get absolute image paths in your css files using sass/scss动态生成它。

    CSS

    body {
      background-image: image-url(background.png);
    }
    

    在你的环境文件中用你的改变它

    config.action_controller.asset_host = "http://your.domain.com/"
    

    那么你的 css 会是这样的:

    body {
      background-image: url(http://your.domain.com/assets/background.png);
    }
    

    【讨论】:

      【解决方案7】:

      如果您遇到无法从视图访问root_url 的问题,您可以将其传递给视图,或者您也可以添加一个.env 变量,然后在根目录中调用它。

      asset_url('image.png', host: "https://#{ENV['HOSTNAME']}/")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-10
        • 2011-08-30
        相关资源
        最近更新 更多