Spec-Zone.ru › Ruby on Rails 5.1

модуль 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"

Вспомогательные методы учитывают это:

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

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

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

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

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

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

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

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

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

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

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

Кроме того, вы можете запросить второй параметр request. Он особенно полезен для предоставления ресурсов с защищенной SSL страницей. Приведенный ниже пример proc отключает хостинг ресурсов для HTTPS-соединений, но по-прежнему отправляет ресурсы для обычных HTTP-запросов с хостов ресурсов. Если у вас нет сертификатов SSL для каждого из хостов ресурсов, эта методика позволяет избежать предупреждений в клиенте о смешанных типах медиа. Обратите внимание, что параметр запроса может не предоставляться, например, при предварительной компиляции ресурсов через задачу Rake. Убедитесь, что используете Proc вместо lambda, так как 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 и принимает один или два параметра, точно так же, как proc.

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 181
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(/([\?#].+)$/, "".freeze)

  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.starts_with?("#{relative_url_root}/")
  end

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

  "#{source}#{tail}"
end

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

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

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

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

asset_path("application.js") # => "/assets/application-60aa4fdc5cea14baf5400fba1abf4f2a46a5166bad4772b1effe341570f07de9.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 225
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 424
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 436
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/horse.wav
Также имеет псевдоним: url_to_audio
compute_asset_extname(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 237
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 271
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 (число - это остаток от деления хэша источника на 4), или значение, возвращаемое вызовом call на объекте, отвечающем на вызов call (proc или иное).

compute_asset_path(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 260
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 449
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 461
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/font.ttf
Также имеет псевдоним: url_to_font
image_path(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 372
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 384
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/edit.png
Также имеет псевдоним: url_to_image
javascript_path(source, options = {}) Show source
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 315
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 327
def javascript_url(source, options = {})
  url_to_asset(source, { type: :javascript }.merge!(options))
end

Вычисляет полный URL к ресурсу JavaScript в папке public 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/dir/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 342
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 354
def stylesheet_url(source, options = {})
  url_to_asset(source, { type: :stylesheet }.merge!(options))
end

Вычисляет полный URL к ресурсу таблицы стилей в каталоге public 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/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 398
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 410
def video_url(source, options = {})
  url_to_asset(source, { type: :video }.merge!(options))
end

Вычисляет полный URL к видео-ресурсу в каталоге public 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/hd.avi
Также псевдоним: url_to_video

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

Spec-Zone.ru

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