Spec-Zone.ru › Ruby on Rails 7.0

модуль ActionView::Helpers::AssetUrlHelper

Этот модуль предоставляет методы для генерации путей и URL-адресов к ресурсам приложения.

image_path("rails.png")
# => "/assets/rails.png"

image_url("rails.png")
# => "http://www.example.com/assets/rails.png"

Использование хостов ресурсов

По умолчанию Rails связывает эти ресурсы с текущим хостом в папке public, но вы можете направить Rails на подключение к ресурсам с выделенного сервера ресурсов, установив ActionController::Base.asset_host в конфигурации приложения, обычно в config/environments/production.rb. Например, вы определите assets.example.com как свой хост ресурсов таким образом, внутри блока configure ваших файлов конфигурации для определённой среды или config/application.rb:

config.action_controller.asset_host = "assets.example.com"

Helpers учтёт это:

image_tag("rails.png")
# => <img src="http://assets.example.com/assets/rails.png" />
stylesheet_link_tag("application")
# => <link href="http://assets.example.com/assets/application.css" rel="stylesheet" />

Браузеры открывают ограниченное число одновременных подключений к одному хосту. Точное количество варьируется в зависимости от браузера и версии. Это ограничение может привести к тому, что некоторые загрузки ресурсов будут ждать завершения предыдущих ресурсов, прежде чем они смогут начаться. Вы можете использовать %d подстановку в asset_host для распределения запросов по четырём хостам. Например, assets%d.example.com разошлёт запросы на ресурсы по «assets0.example.com», …, «assets3.example.com».

image_tag("rails.png")
# => <img src="http://assets0.example.com/assets/rails.png" />
stylesheet_link_tag("application")
# => <link href="http://assets2.example.com/assets/application.css" rel="stylesheet" />

Это может улучшить производительность загрузки ресурсов вашего приложения. Также возможно, что сочетание дополнительной нагрузки на подключение (DNS, SSL) и общих ограничений на подключения браузера может привести к тому, что это решение будет медленнее. Вы должны убедиться, что измерили фактическую производительность на целевых браузерах как до, так и после этого изменения.

Для реализации соответствующих хостов вы можете настроить четыре реальных хоста или использовать подстановку DNS для CNAME, связывающей подстановку с одним хостом ресурсов. Вы можете узнать больше о настройке записей CNAME DNS от вашего интернет-провайдера.

Примечание: это чисто оптимизация производительности браузера и не предназначено для балансировки нагрузки сервера. Подробнее см. www.die.net/musings/page_load_time/ для контекста и www.browserscope.org/?category=network для данных об ограничениях подключений.

В качестве альтернативы вы можете получить больший контроль над хостом ресурсов, установив asset_host в процедуру, как показано ниже:

ActionController::Base.asset_host = Proc.new { |source|
  "http://assets#{OpenSSL::Digest::SHA256.hexdigest(source).to_i(16) % 2 + 1}.example.com"
}
image_tag("rails.png")
# => <img src="http://assets1.example.com/assets/rails.png" />
stylesheet_link_tag("application")
# => <link href="http://assets2.example.com/assets/application.css" rel="stylesheet" />

Приведённый пример генерирует «assets1.example.com» и «assets2.example.com». Этот вариант полезен, например, если вам нужно меньше/больше четырёх хостов, настраиваемые имена хостов и т. п.

Как вы видите, процедура принимает параметр source. Это строка с абсолютным путём к ресурсу, например, «/assets/rails.png».

 ActionController::Base.asset_host = Proc.new { |source|
   if source.end_with?('.css')
     "http://stylesheets.example.com"
   else
     "http://assets.example.com"
   end
 }
image_tag("rails.png")
# => <img src="http://assets.example.com/assets/rails.png" />
stylesheet_link_tag("application")
# => <link href="http://stylesheets.example.com/assets/application.css" rel="stylesheet" />

В качестве альтернативы можно запросить второй параметр request. Он особенно полезен для предоставления ресурсов с защищённой SSL страницей. Приведённая ниже процедура отключает хостинг ресурсов для HTTPS-соединений, но по-прежнему отправляет ресурсы для обычных HTTP-запросов с хостов ресурсов. Если у вас нет сертификатов SSL для каждого хоста ресурсов, этот приём позволяет избежать предупреждений в клиенте о смешанных медиа. Обратите внимание, что параметр request может отсутствовать, например, при предварительной компиляции ресурсов командой bin/rails assets:precompile. Убедитесь, что вы используете Proc вместо лямбды, так как Proc допускает пропущенные параметры и устанавливает их в nil.

config.action_controller.asset_host = Proc.new { |source, request|
  if request && request.ssl?
    "#{request.protocol}#{request.host_with_port}"
  else
    "#{request.protocol}assets.example.com"
  end
}

Также можно реализовать объект пользовательского хоста ресурсов, который отвечает на call и принимает один или два параметра, как и процедура.

config.action_controller.asset_host = AssetHostingWithMinimumSsl.new(
  "http://asset%d.example.com", "https://asset1.example.com"
)

Константы

ASSET_EXTENSIONS
ASSET_PUBLIC_DIRECTORIES

Сопоставляет типы ресурсов с общедоступным каталогом.

URI_REGEXP

Публичные методы экземпляра

asset_path(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 186
def asset_path(source, options = {})
  raise ArgumentError, "nil is not a valid asset source" if source.nil?

  source = source.to_s
  return "" if source.blank?
  return source if URI_REGEXP.match?(source)

  tail, source = source[/([?#].+)$/], source.sub(/([?#].+)$/, "")

  if extname = compute_asset_extname(source, options)
    source = "#{source}#{extname}"
  end

  if source[0] != ?/
    if options[:skip_pipeline]
      source = public_compute_asset_path(source, options)
    else
      source = compute_asset_path(source, options)
    end
  end

  relative_url_root = defined?(config.relative_url_root) && config.relative_url_root
  if relative_url_root
    source = File.join(relative_url_root, source) unless source.start_with?("#{relative_url_root}/")
  end

  if host = compute_asset_host(source, options)
    source = File.join(host, source)
  end

  "#{source}#{tail}"
end

Это точка входа для всех ресурсов. При использовании gem конвейера ресурсов (например, propshaft или sprockets-rails), поведение «расширено». Вы можете обойти конвейер ресурсов, передав skip_pipeline: true в параметры.

Все другие вспомогательные функции *_path делегируют через этот метод.

С конвейером ресурсов

Все параметры, переданные в asset_path, будут переданы в compute_asset_path, который реализован gem'ами конвейера ресурсов.

asset_path("application.js") # => "/assets/application-60aa4fdc5cea14baf5400fba1abf4f2a46a5166bad4772b1effe341570f07de9.js"
asset_path('application.js', host: 'example.com') # => "//example.com/assets/application.js"
asset_path("application.js", host: 'example.com', protocol: 'https') # => "https://example.com/assets/application.js"

Без конвейера ресурсов (skip_pipeline: true)

Принимает параметр type, который может указывать расширение ресурса. Проверка на корректность переданного в asset_path источника и существование файла на диске не выполняется.

asset_path("application.js", skip_pipeline: true)                 # => "application.js"
asset_path("filedoesnotexist.png", skip_pipeline: true)           # => "filedoesnotexist.png"
asset_path("application", type: :javascript, skip_pipeline: true) # => "/javascripts/application.js"
asset_path("application", type: :stylesheet, skip_pipeline: true) # => "/stylesheets/application.css"

Параметры, применяемые ко всем ресурсам

Ниже перечислены сценарии, которые применяются к asset_path независимо от того, используете ли вы конвейер ресурсов.

  • Все полностью квалифицированные URL-адреса возвращаются немедленно. Это обходит конвейер ресурсов и все другое описанное поведение.

    asset_path("http://www.example.com/js/xmlhr.js") # => "http://www.example.com/js/xmlhr.js"
    
  • Все ресурсы, начинающиеся с прямой косой черты, считаются полными URL-адресами и не будут расширены. Это обойдет конвейер ресурсов.

    asset_path("/foo.png") # => "/foo.png"
    
  • Все пустые строки будут возвращены немедленно. Это обходит конвейер ресурсов и все другое описанное поведение.

    asset_path("") # => ""
    
  • Если указан config.relative_url_root, ко всем ресурсам будет добавлен этот корень.

    Rails.application.config.relative_url_root = "bar"
    asset_path("foo.js", skip_pipeline: true) # => "bar/foo.js"
    
  • Другой хост ресурсов может быть указан через config.action_controller.asset_host; это обычно используется в сочетании с CDN.

    Rails.application.config.action_controller.asset_host = "assets.example.com"
    asset_path("foo.js", skip_pipeline: true) # => "http://assets.example.com/foo.js"
    
  • Имя расширения может быть указано вручную с помощью extname.

    asset_path("foo", skip_pipeline: true, extname: ".js")     # => "/foo.js"
    asset_path("foo.css", skip_pipeline: true, extname: ".js") # => "/foo.css.js"
    
Также называется: path_to_asset
asset_url(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 230
def asset_url(source, options = {})
  path_to_asset(source, options.merge(protocol: :request))
end

Вычисляет полный URL-адрес ресурса в общедоступном каталоге. Внутренне будет использовать asset_path, поэтому большая часть их поведения будет одинаковой. Если указан параметр :host, он перезаписывает глобальную настройку config.action_controller.asset_host.

Все остальные предоставленные параметры передаются вызову asset_path.

asset_url "application.js"                                 # => http://example.com/assets/application.js
asset_url "application.js", host: "http://cdn.example.com" # => http://cdn.example.com/assets/application.js
Также называется: url_to_asset
audio_path(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 429
def audio_path(source, options = {})
  path_to_asset(source, { type: :audio }.merge!(options))
end

Вычисляет путь к аудиоресурсу в общедоступном каталоге audios. Полные пути от корня документа будут переданы. Используется внутренне audio_tag для построения пути к аудио.

audio_path("horse")                                            # => /audios/horse
audio_path("horse.wav")                                        # => /audios/horse.wav
audio_path("sounds/horse.wav")                                 # => /audios/sounds/horse.wav
audio_path("/sounds/horse.wav")                                # => /sounds/horse.wav
audio_path("http://www.example.com/sounds/horse.wav")          # => http://www.example.com/sounds/horse.wav
Также называется: path_to_audio
audio_url(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 441
def audio_url(source, options = {})
  url_to_asset(source, { type: :audio }.merge!(options))
end

Вычисляет полный URL-адрес к аудиоресурсу в общедоступном каталоге audios. Внутренне будет использовать audio_path, поэтому большая часть их поведения будет одинаковой. Так как audio_url основан на методе asset_url, вы можете установить параметры :host. Если указан параметр :host, он перезаписывает глобальную настройку config.action_controller.asset_host.

audio_url "horse.wav", host: "http://stage.example.com" # => http://stage.example.com/audios/horse.wav
Также называется: url_to_audio
compute_asset_extname(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 242
def compute_asset_extname(source, options = {})
  return if options[:extname] == false
  extname = options[:extname] || ASSET_EXTENSIONS[options[:type]]
  if extname && File.extname(source) != extname
    extname
  else
    nil
  end
end

Вычисляет расширение для добавления к пути ресурса. Возвращает nil, если ничего добавлять не нужно.

compute_asset_host(source = "", options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 276
def compute_asset_host(source = "", options = {})
  request = self.request if respond_to?(:request)
  host = options[:host]
  host ||= config.asset_host if defined? config.asset_host

  if host
    if host.respond_to?(:call)
      arity = host.respond_to?(:arity) ? host.arity : host.method(:call).arity
      args = [source]
      args << request if request && (arity > 1 || arity < 0)
      host = host.call(*args)
    elsif host.include?("%d")
      host = host % (Zlib.crc32(source) % 4)
    end
  end

  host ||= request.base_url if request && options[:protocol] == :request
  return unless host

  if URI_REGEXP.match?(host)
    host
  else
    protocol = options[:protocol] || config.default_asset_host_protocol || (request ? :request : :relative)
    case protocol
    when :relative
      "//#{host}"
    when :request
      "#{request.protocol}#{host}"
    else
      "#{protocol}://#{host}"
    end
  end
end

Выбирает хост ресурсов для этого источника. Возвращает nil, если хост не установлен, хост, если не установлен подстановочный знак, хост, интерполированный с числами 0-3, если он содержит %d (число - это хэш источника mod 4), или значение, возвращаемое вызовом call на объекте, отвечающем на вызов (proc или иное).

compute_asset_path(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 265
def compute_asset_path(source, options = {})
  dir = ASSET_PUBLIC_DIRECTORIES[options[:type]] || ""
  File.join(dir, source)
end

Вычисляет путь к ресурсу в общедоступном каталоге. Плагины и расширения могут переопределить этот метод, чтобы указывать на пользовательские ресурсы или генерировать хешированные пути или строки запросов.

Также называется: public_compute_asset_path
font_path(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 454
def font_path(source, options = {})
  path_to_asset(source, { type: :font }.merge!(options))
end

Вычисляет путь к шрифту. Полные пути от корня документа будут переданы.

font_path("font")                                           # => /fonts/font
font_path("font.ttf")                                       # => /fonts/font.ttf
font_path("dir/font.ttf")                                   # => /fonts/dir/font.ttf
font_path("/dir/font.ttf")                                  # => /dir/font.ttf
font_path("http://www.example.com/dir/font.ttf")            # => http://www.example.com/dir/font.ttf
Также называется: path_to_font
font_url(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 466
def font_url(source, options = {})
  url_to_asset(source, { type: :font }.merge!(options))
end

Вычисляет полный URL-адрес к шрифту. Внутренне будет использовать font_path, поэтому большая часть их поведения будет одинаковой. Так как font_url основан на методе asset_url, вы можете установить параметры :host. Если указан параметр :host, он перезаписывает глобальную настройку config.action_controller.asset_host.

font_url "font.ttf", host: "http://stage.example.com" # => http://stage.example.com/fonts/font.ttf
Также называется: url_to_font
image_path(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 377
def image_path(source, options = {})
  path_to_asset(source, { type: :image }.merge!(options))
end

Вычисляет путь к изображению. Полные пути от корня документа будут переданы. Используется внутренне image_tag для построения пути к изображению:

image_path("edit")                                         # => "/assets/edit"
image_path("edit.png")                                     # => "/assets/edit.png"
image_path("icons/edit.png")                               # => "/assets/icons/edit.png"
image_path("/icons/edit.png")                              # => "/icons/edit.png"
image_path("http://www.example.com/img/edit.png")          # => "http://www.example.com/img/edit.png"

Если у вас есть изображения в качестве ресурсов приложения, этот метод может конфликтовать с их именованными маршрутами. Псевдоним path_to_image предоставлен для избежания этого. Rails использует псевдоним внутренне, и авторам плагинов рекомендуется делать то же самое.

Также называется: path_to_image
image_url(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 389
def image_url(source, options = {})
  url_to_asset(source, { type: :image }.merge!(options))
end

Вычисляет полный URL-адрес к изображению. Внутренне будет использовать image_path, поэтому большая часть их поведения будет одинаковой. Так как image_url основан на методе asset_url, вы можете установить параметры :host. Если указан параметр :host, он перезаписывает глобальную настройку config.action_controller.asset_host.

image_url "edit.png", host: "http://stage.example.com" # => http://stage.example.com/assets/edit.png
Также называется: url_to_image
javascript_path(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 320
def javascript_path(source, options = {})
  path_to_asset(source, { type: :javascript }.merge!(options))
end

Вычисляет путь к JavaScript-ресурсу в общедоступном каталоге javascripts. Если имя файла source не имеет расширения, будет добавлено .js (за исключением явных URI). Полные пути от корня документа будут переданы. Используется внутренне javascript_include_tag для построения пути к скрипту.

javascript_path "xmlhr"                              # => /assets/xmlhr.js
javascript_path "dir/xmlhr.js"                       # => /assets/dir/xmlhr.js
javascript_path "/dir/xmlhr"                         # => /dir/xmlhr.js
javascript_path "http://www.example.com/js/xmlhr"    # => http://www.example.com/js/xmlhr
javascript_path "http://www.example.com/js/xmlhr.js" # => http://www.example.com/js/xmlhr.js
Также называется: path_to_javascript
javascript_url(source, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 332
def javascript_url(source, options = {})
  url_to_asset(source, { type: :javascript }.merge!(options))
end

Вычисляет полный URL для ресурса JavaScript в общедоступном каталоге javascripts. Это будет использовать javascript_path внутри, поэтому большинство их поведений будут одинаковыми. Так как javascript_url основано на методе asset_url, вы можете установить параметр :host. Если параметр :host задан, он перезаписывает глобальную настройку config.action_controller.asset_host.

javascript_url "js/xmlhr.js", host: "http://stage.example.com" # => http://stage.example.com/assets/js/xmlhr.js
Также использует псевдоним: url_to_javascript
path_to_asset(source, options = {})
Псевдоним для: asset_path
path_to_audio(source, options = {})
Псевдоним для: audio_path
path_to_font(source, options = {})
Псевдоним для: font_path
path_to_image(source, options = {})
Псевдоним для: image_path
path_to_javascript(source, options = {})
Псевдоним для: javascript_path
path_to_stylesheet(source, options = {})
Псевдоним для: stylesheet_path
path_to_video(source, options = {})
Псевдоним для: video_path
public_compute_asset_path(source, options = {})
Псевдоним для: compute_asset_path
stylesheet_path(source, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 347
def stylesheet_path(source, options = {})
  path_to_asset(source, { type: :stylesheet }.merge!(options))
end

Вычисляет путь к ресурсу таблицы стилей в каталоге public stylesheets. Если у файла source нет расширения, будет добавлен .css (за исключением явных URI). Полные пути от корня документа будут переданы без изменений. Используется внутри stylesheet_link_tag для построения пути к таблице стилей.

stylesheet_path "style"                                  # => /assets/style.css
stylesheet_path "dir/style.css"                          # => /assets/dir/style.css
stylesheet_path "/dir/style.css"                         # => /dir/style.css
stylesheet_path "http://www.example.com/css/style"       # => http://www.example.com/css/style
stylesheet_path "http://www.example.com/css/style.css"   # => http://www.example.com/css/style.css
Также использует псевдоним: path_to_stylesheet
stylesheet_url(source, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 359
def stylesheet_url(source, options = {})
  url_to_asset(source, { type: :stylesheet }.merge!(options))
end

Вычисляет полный URL для ресурса таблицы стилей в общедоступном каталоге stylesheets. Это будет использовать stylesheet_path внутри, поэтому большинство их поведений будут одинаковыми. Так как stylesheet_url основано на методе asset_url, вы можете установить параметр :host. Если параметр :host задан, он перезаписывает глобальную настройку config.action_controller.asset_host.

stylesheet_url "css/style.css", host: "http://stage.example.com" # => http://stage.example.com/assets/css/style.css
Также использует псевдоним: url_to_stylesheet
url_to_asset(source, options = {})
Псевдоним для: asset_url
url_to_audio(source, options = {})
Псевдоним для: audio_url
url_to_font(source, options = {})
Псевдоним для: font_url
url_to_image(source, options = {})
Псевдоним для: image_url
url_to_javascript(source, options = {})
Псевдоним для: javascript_url
url_to_stylesheet(source, options = {})
Псевдоним для: stylesheet_url
url_to_video(source, options = {})
Псевдоним для: video_url
video_path(source, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 403
def video_path(source, options = {})
  path_to_asset(source, { type: :video }.merge!(options))
end

Вычисляет путь к видео-ресурсу в каталоге public videos. Полные пути от корня документа будут переданы без изменений. Используется внутри video_tag для построения пути к видео.

video_path("hd")                                            # => /videos/hd
video_path("hd.avi")                                        # => /videos/hd.avi
video_path("trailers/hd.avi")                               # => /videos/trailers/hd.avi
video_path("/trailers/hd.avi")                              # => /trailers/hd.avi
video_path("http://www.example.com/vid/hd.avi")             # => http://www.example.com/vid/hd.avi
Также использует псевдоним: path_to_video
video_url(source, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 415
def video_url(source, options = {})
  url_to_asset(source, { type: :video }.merge!(options))
end

Вычисляет полный URL для видео-ресурса в общедоступном каталоге videos. Это будет использовать video_path внутри, поэтому большинство их поведений будут одинаковыми. Так как video_url основано на методе asset_url, вы можете установить параметр :host. Если параметр :host задан, он перезаписывает глобальную настройку config.action_controller.asset_host.

video_url "hd.avi", host: "http://stage.example.com" # => http://stage.example.com/videos/hd.avi
Также использует псевдоним: url_to_video

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API