Spec-Zone.ru › Ruby on Rails 4.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"

Helpers учитывают это:

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”. Если этот символ подстановки присутствует, Rails распределяет запросы к ресурсам среди соответствующих четырёх хостов “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 для CNAME для одного хоста ресурсов. Вы можете узнать больше о настройке записей DNS CNAME от вашего интернет-провайдера.

Примечание: Это чисто оптимизация производительности браузера и не предназначено для балансировки нагрузки сервера. См. www.die.net/musings/page_load_time для дополнительной информации.

В качестве альтернативы, вы можете получить больше контроля над хостом ресурсов, установив 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”. Этот вариант полезен, например, если вам нужно меньше/больше четырёх хостов, настраиваемые имена хостов и т. д.

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

config.action_controller.asset_host = Proc.new { |source, request|
  if 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 = {}) Показать исходный код

Вычисляет путь к ресурсу в общедоступном каталоге. Если задан параметр :type в options, будет добавлен расширение файла и указан соответствующий общедоступный каталог.

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

asset_path "application.js"                     # => /application.js
asset_path "application", type: :javascript     # => /javascripts/application.js
asset_path "application", type: :stylesheet     # => /stylesheets/application.css
asset_path "http://www.example.com/js/xmlhr.js" # => http://www.example.com/js/xmlhr.js
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 120
def asset_path(source, options = {})
  source = source.to_s
  return "" unless source.present?
  return source if source =~ URI_REGEXP

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

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

  if source[0] != ?/
    source = compute_asset_path(source, options)
  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
Также алиасирован как: path_to_asset
asset_url(source, options = {}) Показать исходный код

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

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 151
def asset_url(source, options = {})
  path_to_asset(source, options.merge(:protocol => :request))
end
Также алиасирован как: url_to_asset
audio_path(source, options = {}) Показать исходный код

Вычисляет путь к аудио ресурсу в общедоступном каталоге 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
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 322
def audio_path(source, options = {})
  path_to_asset(source, {type: :audio}.merge!(options))
end
Также алиасирован как: path_to_audio
audio_url(source, options = {}) Показать исходный код

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

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 329
def audio_url(source, options = {})
  url_to_asset(source, {type: :audio}.merge!(options))
end
Также алиасирован как: url_to_audio
compute_asset_extname(source, options = {}) Показать исходный код

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

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 163
def compute_asset_extname(source, options = {})
  return if options[:extname] == false
  extname = options[:extname] || ASSET_EXTENSIONS[options[:type]]
  extname if extname && File.extname(source) != extname
end
compute_asset_host(source = "", options = {}) Показать исходный код

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

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 192
def compute_asset_host(source = "", options = {})
  request = self.request if respond_to?(:request)
  host = config.asset_host if defined? config.asset_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 =~ /%d/
    host = host % (Zlib.crc32(source) % 4)
  end

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

  if host =~ URI_REGEXP
    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
compute_asset_path(source, options = {}) Показать исходный код

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

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 182
def compute_asset_path(source, options = {})
  dir = ASSET_PUBLIC_DIRECTORIES[options[:type]] || ""
  File.join(dir, source)
end
font_path(source, options = {}) Показать исходный код

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

font_path("font")                                           # => /assets/font
font_path("font.ttf")                                       # => /assets/font.ttf
font_path("dir/font.ttf")                                   # => /assets/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
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 342
def font_path(source, options = {})
  path_to_asset(source, {type: :font}.merge!(options))
end
Также алиасирован как: path_to_font
font_url(source, options = {}) Показать исходный код

Вычисляет полный URL к ресурсу шрифта. Использует font_path внутри, поэтому большинство их поведений будут одинаковыми.

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 349
def font_url(source, options = {})
  url_to_asset(source, {type: :font}.merge!(options))
end
Также алиасирован как: url_to_font
image_path(source, options = {}) Показать исходный код

Вычисляет путь к изображению. Полные пути от корня документа будут переданы. Используется внутри 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 использует алиас внутри, и разработчикам плагинов рекомендуется делать тоже самое.

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 280
def image_path(source, options = {})
  path_to_asset(source, {type: :image}.merge!(options))
end
Также алиасирован как: path_to_image
image_url(source, options = {}) Показать исходный код

Вычисляет полный URL к изображению. Использует image_path внутри, поэтому большинство их поведений будут одинаковыми.

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 287
def image_url(source, options = {})
  url_to_asset(source, {type: :image}.merge!(options))
end
Также алиасирован как: url_to_image
javascript_path(source, options = {}) Показать исходный код

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

javascript_path "xmlhr"                              # => /javascripts/xmlhr.js
javascript_path "dir/xmlhr.js"                       # => /javascripts/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
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 233
def javascript_path(source, options = {})
  path_to_asset(source, {type: :javascript}.merge!(options))
end
Также алиасирован как: path_to_javascript
javascript_url(source, options = {}) Показать исходный код

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

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 240
def javascript_url(source, options = {})
  url_to_asset(source, {type: :javascript}.merge!(options))
end
Также алиасирован как: 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
stylesheet_path(source, options = {}) Показать исходный код

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

stylesheet_path "style"                                  # => /stylesheets/style.css
stylesheet_path "dir/style.css"                          # => /stylesheets/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
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 255
def stylesheet_path(source, options = {})
  path_to_asset(source, {type: :stylesheet}.merge!(options))
end
Также переименовано как: path_to_stylesheet
stylesheet_url(source, options = {}) Показать исходный код

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

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 262
def stylesheet_url(source, options = {})
  url_to_asset(source, {type: :stylesheet}.merge!(options))
end
Также переименовано как: 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 = {}) Показать исходный код

Вычисляет путь к видео-активу в общедоступном каталоге видео. Полные пути от корня документа будут переданы без изменений. Используется внутри 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
# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 301
def video_path(source, options = {})
  path_to_asset(source, {type: :video}.merge!(options))
end
Также переименовано как: path_to_video
video_url(source, options = {}) Показать исходный код

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

# File actionview/lib/action_view/helpers/asset_url_helper.rb, line 308
def video_url(source, options = {})
  url_to_asset(source, {type: :video}.merge!(options))
end
Также переименовано как: url_to_video

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

Spec-Zone.ru

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