Spec-Zone.ru › Ruby on Rails 7.0

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

Включенные модули:
ActionView::Helpers::TagHelper

Предоставляет набор методов для создания ссылок и получения URL-адресов, которые зависят от системы маршрутизации (см. ActionDispatch::Routing). Это позволяет использовать одинаковый формат ссылок в представлениях и контроллерах.

Константы

BUTTON_TAG_METHOD_VERBS

Этот помощник может быть включён в любой класс, который включает помощники URL-адресов маршрутов (routes.url_helpers). Некоторые методы, предоставляемые здесь, будут работать только в контексте запроса (link_to_unless_current, например), который должен быть предоставлен как метод, названный request в контексте.

STRINGIFIED_COMMON_METHODS

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

_current_page?(options = nil, check_parameters: false, **options_as_kwargs)
Псевдоним для: current_page?
button_to(name = nil, options = nil, html_options = nil, &block) Показать исходный код
# File actionview/lib/action_view/helpers/url_helper.rb, line 333
def button_to(name = nil, options = nil, html_options = nil, &block)
  html_options, options = options, name if block_given?
  html_options ||= {}
  html_options = html_options.stringify_keys

  url =
    case options
    when FalseClass then nil
    else url_for(options)
    end

  remote = html_options.delete("remote")
  params = html_options.delete("params")

  authenticity_token = html_options.delete("authenticity_token")

  method     = (html_options.delete("method").presence || method_for_options(options)).to_s
  method_tag = BUTTON_TAG_METHOD_VERBS.include?(method) ? method_tag(method) : "".html_safe

  form_method  = method == "get" ? "get" : "post"
  form_options = html_options.delete("form") || {}
  form_options[:class] ||= html_options.delete("form_class") || "button_to"
  form_options[:method] = form_method
  form_options[:action] = url
  form_options[:'data-remote'] = true if remote

  request_token_tag = if form_method == "post"
    request_method = method.empty? ? "post" : method
    token_tag(authenticity_token, form_options: { action: url, method: request_method })
  else
    ""
  end

  html_options = convert_options_to_data_attributes(options, html_options)
  html_options["type"] = "submit"

  button = if block_given?
    content_tag("button", html_options, &block)
  elsif button_to_generates_button_tag
    content_tag("button", name || url, html_options, &block)
  else
    html_options["value"] = name || url
    tag("input", html_options)
  end

  inner_tags = method_tag.safe_concat(button).safe_concat(request_token_tag)
  if params
    to_form_params(params).each do |param|
      inner_tags.safe_concat tag(:input, type: "hidden", name: param[:name], value: param[:value],
                                 autocomplete: "off")
    end
  end
  content_tag("form", inner_tags, form_options)
end

Генерирует форму, содержащую единственную кнопку, которая отправляет запрос на URL, созданный набором options. Это самый безопасный метод, чтобы гарантировать, что ссылки, вызывающие изменения данных, не запускаются поисковыми ботами или ускорителями. Если кнопка HTML не работает с вашей разметкой, вы также можете использовать метод link_to с модификатором :method, как описано в документации link_to.

Вы можете управлять поведением формы и кнопки с помощью html_options. Большинство значений в html_options передаются элементу кнопки. Например, передача опции :class в html_options установит атрибут класса элемента кнопки.

Атрибут класса элемента формы можно установить, передав опцию :form_class в html_options. По умолчанию он равен "button_to", чтобы разрешить стилизацию формы и ее дочерних элементов.

Форма отправляет POST-запрос по умолчанию. Вы можете указать другой HTTP-глагол через опцию :method в html_options.

Параметры

Хэш options принимает те же параметры, что и url_for. Чтобы сгенерировать элемент <form> без атрибута [action], передайте false:

<%= button_to "New", false %>
# => "<form method="post" class="button_to">
#      <button type="submit">New</button>
#      <input name="authenticity_token" type="hidden" value="10f2163b45388899ad4d5ae948988266befcb6c3d1b2451cf657a0c293d605a6"/>
#    </form>"

Большинство значений в html_options передаются элементу кнопки, но есть несколько специальных параметров:

  • :method — Символ HTTP-глагола. Поддерживаемые глаголы: :post, :get, :delete, :patch, и :put. По умолчанию это :post.

  • :disabled — Если установлено в true, генерирует отключенную кнопку.

  • :data — Этот параметр можно использовать для добавления пользовательских атрибутов данных.

  • :remote — Если установлено в true, позволит драйверам Unobtrusive JavaScript управлять поведением отправки. По умолчанию это Ajax-отправка.

  • :form — Этот хэш будет атрибутами формы.

  • :form_class — Управляет классом формы, в которую будет помещена кнопка отправки.

  • :params — Хэш параметров, которые будут отображены как скрытые поля в форме.

Атрибуты данных

  • :confirm — Использует драйвер unobtrusive JavaScript для запроса с заданным вопросом. Если пользователь согласен, ссылка обрабатывается обычно, в противном случае действие не выполняется.

  • :disable_with — Значение этого параметра будет использоваться в качестве значения для отключенной версии кнопки отправки при отправке формы. Эта функция предоставляется драйвером unobtrusive JavaScript.

Примеры

<%= button_to "New", action: "new" %>
# => "<form method="post" action="/controller/new" class="button_to">
#      <button type="submit">New</button>
#      <input name="authenticity_token" type="hidden" value="10f2163b45388899ad4d5ae948988266befcb6c3d1b2451cf657a0c293d605a6" autocomplete="off"/>
#    </form>"

<%= button_to "New", new_article_path %>
# => "<form method="post" action="/articles/new" class="button_to">
#      <button type="submit">New</button>
#      <input name="authenticity_token" type="hidden" value="10f2163b45388899ad4d5ae948988266befcb6c3d1b2451cf657a0c293d605a6" autocomplete="off"/>
#    </form>"

<%= button_to "New", new_article_path, params: { time: Time.now  } %>
# => "<form method="post" action="/articles/new" class="button_to">
#      <button type="submit">New</button>
#      <input name="authenticity_token" type="hidden" value="10f2163b45388899ad4d5ae948988266befcb6c3d1b2451cf657a0c293d605a6"/>
#      <input type="hidden" name="time" value="2021-04-08 14:06:09 -0500" autocomplete="off">
#    </form>"

<%= button_to [:make_happy, @user] do %>
  Make happy <strong><%= @user.name %></strong>
<% end %>
# => "<form method="post" action="/users/1/make_happy" class="button_to">
#      <button type="submit">
#        Make happy <strong><%= @user.name %></strong>
#      </button>
#      <input name="authenticity_token" type="hidden" value="10f2163b45388899ad4d5ae948988266befcb6c3d1b2451cf657a0c293d605a6"  autocomplete="off"/>
#    </form>"

<%= button_to "New", { action: "new" }, form_class: "new-thing" %>
# => "<form method="post" action="/controller/new" class="new-thing">
#      <button type="submit">New</button>
#      <input name="authenticity_token" type="hidden" value="10f2163b45388899ad4d5ae948988266befcb6c3d1b2451cf657a0c293d605a6"  autocomplete="off"/>
#    </form>"

<%= button_to "Create", { action: "create" }, remote: true, form: { "data-type" => "json" } %>
# => "<form method="post" action="/images/create" class="button_to" data-remote="true" data-type="json">
#      <button type="submit">Create</button>
#      <input name="authenticity_token" type="hidden" value="10f2163b45388899ad4d5ae948988266befcb6c3d1b2451cf657a0c293d605a6"  autocomplete="off"/>
#    </form>"

<%= button_to "Delete Image", { action: "delete", id: @image.id },
                                method: :delete, data: { confirm: "Are you sure?" } %>
# => "<form method="post" action="/images/delete/1" class="button_to">
#      <input type="hidden" name="_method" value="delete" />
#      <button data-confirm='Are you sure?' type="submit">Delete Image</button>
#      <input name="authenticity_token" type="hidden" value="10f2163b45388899ad4d5ae948988266befcb6c3d1b2451cf657a0c293d605a6" autocomplete="off"/>
#    </form>"

<%= button_to('Destroy', 'http://www.example.com',
          method: :delete, remote: true, data: { confirm: 'Are you sure?', disable_with: 'loading...' }) %>
# => "<form class='button_to' method='post' action='http://www.example.com' data-remote='true'>
#       <input name='_method' value='delete' type='hidden' />
#       <button type='submit' data-disable-with='loading...' data-confirm='Are you sure?'>Destroy</button>
#       <input name="authenticity_token" type="hidden" value="10f2163b45388899ad4d5ae948988266befcb6c3d1b2451cf657a0c293d605a6" autocomplete="off"/>
#     </form>"
#
current_page?(options = nil, check_parameters: false, **options_as_kwargs) Показать исходный код
# File actionview/lib/action_view/helpers/url_helper.rb, line 584
def current_page?(options = nil, check_parameters: false, **options_as_kwargs)
  unless request
    raise "You cannot use helpers that need to determine the current " \
          "page unless your view context provides a Request object " \
          "in a #request method"
  end

  return false unless request.get? || request.head?

  options ||= options_as_kwargs
  check_parameters ||= options.is_a?(Hash) && options.delete(:check_parameters)
  url_string = URI::DEFAULT_PARSER.unescape(url_for(options)).force_encoding(Encoding::BINARY)

  # We ignore any extra parameters in the request_uri if the
  # submitted URL doesn't have any either. This lets the function
  # work with things like ?order=asc
  # the behaviour can be disabled with check_parameters: true
  request_uri = url_string.index("?") || check_parameters ? request.fullpath : request.path
  request_uri = URI::DEFAULT_PARSER.unescape(request_uri).force_encoding(Encoding::BINARY)

  if %r{^\w+://}.match?(url_string)
    request_uri = +"#{request.protocol}#{request.host_with_port}#{request_uri}"
  end

  remove_trailing_slash!(url_string)
  remove_trailing_slash!(request_uri)

  url_string == request_uri
end

True, если текущий URI запроса был сгенерирован заданным options.

Примеры

Предположим, мы находимся в действии http://www.example.com/shop/checkout?order=desc&page=1.

current_page?(action: 'process')
# => false

current_page?(action: 'checkout')
# => true

current_page?(controller: 'library', action: 'checkout')
# => false

current_page?(controller: 'shop', action: 'checkout')
# => true

current_page?(controller: 'shop', action: 'checkout', order: 'asc')
# => false

current_page?(controller: 'shop', action: 'checkout', order: 'desc', page: '1')
# => true

current_page?(controller: 'shop', action: 'checkout', order: 'desc', page: '2')
# => false

current_page?('http://www.example.com/shop/checkout')
# => true

current_page?('http://www.example.com/shop/checkout', check_parameters: true)
# => false

current_page?('/shop/checkout')
# => true

current_page?('http://www.example.com/shop/checkout?order=desc&page=1')
# => true

Предположим, мы находимся в действии http://www.example.com/products с методом POST в случае неверного продукта.

current_page?(controller: 'product', action: 'index')
# => false

Мы также можем передавать символьные аргументы вместо строк.

Также алиасирован как: _current_page?
link_to(name = nil, options = nil, html_options = nil, &block) Показать исходный код
# File actionview/lib/action_view/helpers/url_helper.rb, line 209
def link_to(name = nil, options = nil, html_options = nil, &block)
  html_options, options, name = options, name, block if block_given?
  options ||= {}

  html_options = convert_options_to_data_attributes(options, html_options)

  url = url_target(name, options)
  html_options["href"] ||= url

  content_tag("a", name || url, html_options, &block)
end

Создаёт элемент якоря с заданным name используя URL, созданный набором options. Смотрите допустимые параметры в документации для url_for. Также возможно передать строку вместо хэша параметров, что сгенерирует элемент якоря, использующий значение строки как href для ссылки. Использование символа :back вместо хэша параметров сгенерирует ссылку на предшествующую страницу (будет использована ссылка JavaScript, если ссылка на предшествующую страницу отсутствует). Если nil передаётся в качестве имени, то значение самой ссылки станет именем.

Подписи

link_to(body, url, html_options = {})
  # url is a String; you can use URL helpers like
  # posts_path

link_to(body, url_options = {}, html_options = {})
  # url_options, except :method, is passed to url_for

link_to(options = {}, html_options = {}) do
  # name
end

link_to(url, html_options = {}) do
  # name
end

link_to(active_record_model)

Параметры

  • :data — Этот параметр можно использовать для добавления пользовательских атрибутов данных.

  • method: symbol of HTTP verb — Этот модификатор динамически создаст HTML-форму и немедленно отправит форму для обработки с помощью указанного HTTP-глагола. Полезно для выполнения POST-операций по ссылкам в опасных действиях, таких как удаление записи (поисковые боты могут следовать за ними при сканировании вашего сайта). Поддерживаемые глаголы :post, :delete, :patch, и :put. Обратите внимание, что если у пользователя отключён JavaScript, запрос будет выполнен с помощью GET. Если href: '#' используется, и у пользователя отключен JavaScript, нажатие на ссылку не будет иметь эффекта. Если вы полагаетесь на поведение POST, вы должны проверить его в действии вашего контроллера, используя методы объекта запроса для post?, delete?, patch?, или put?.

  • remote: true — Это позволит драйверу unobtrusive JavaScript выполнить Ajax-запрос на указанный URL, вместо перехода по ссылке. Каждый из драйверов предоставляет механизмы для прослушивания завершения Ajax-запроса и выполнения операций JavaScript после их завершения.

Примеры

Поскольку он полагается на url_for, link_to поддерживает как старые аргументы контроллер/действие/id, так и новые RESTful маршруты. Текущий стиль Rails отдаёт предпочтение RESTful маршрутам, когда это возможно, поэтому базируйтесь на ресурсах и используйте

link_to "Profile", profile_path(@profile)
# => <a href="/profiles/1">Profile</a>

или даже более краткое

link_to "Profile", @profile
# => <a href="/profiles/1">Profile</a>

вместо более длинного устаревшего не ориентированного на ресурсы

link_to "Profile", controller: "profiles", action: "show", id: @profile
# => <a href="/profiles/show/1">Profile</a>

Аналогично,

link_to "Profiles", profiles_path
# => <a href="/profiles">Profiles</a>

лучше, чем

link_to "Profiles", controller: "profiles"
# => <a href="/profiles">Profiles</a>

Когда name — nil, href отображается вместо него.

link_to nil, "http://example.com"
# => <a href="http://www.example.com">http://www.example.com</a>

Ещё более лаконично, когда name — модель Active Record, которая определяет метод to_s возвращающий значение по умолчанию или атрибут экземпляра модели

link_to @profile
# => <a href="http://www.example.com/profiles/1">Eileen</a>

Вы можете использовать блок, если целевой адрес ссылки сложно вписать в параметр name. ERB пример:

<%= link_to(@profile) do %>
  <strong><%= @profile.name %></strong> -- <span>Check it out!</span>
<% end %>
# => <a href="/profiles/1">
       <strong>David</strong> -- <span>Check it out!</span>
     </a>

Классы и идентификаторы для CSS легко создавать:

link_to "Articles", articles_path, id: "news", class: "article"
# => <a href="/articles" class="article" id="news">Articles</a>

Будьте осторожны при использовании старого стиля аргументов, так как нужен дополнительный литеральный хэш:

link_to "Articles", { controller: "articles" }, id: "news", class: "article"
# => <a href="/articles" class="article" id="news">Articles</a>

Опущение хэша даёт неправильную ссылку:

link_to "WRONG!", controller: "articles", id: "news", class: "article"
# => <a href="/articles/index/news?class=article">WRONG!</a>

link_to также может создавать ссылки с якорями или параметрами запроса:

link_to "Comment wall", profile_path(@profile, anchor: "wall")
# => <a href="/profiles/1#wall">Comment wall</a>

link_to "Ruby on Rails search", controller: "searches", query: "ruby on rails"
# => <a href="/searches?query=ruby+on+rails">Ruby on Rails search</a>

link_to "Nonsense search", searches_path(foo: "bar", baz: "quux")
# => <a href="/searches?foo=bar&baz=quux">Nonsense search</a>

Единственный параметр, специфичный для link_to (:method) используется следующим образом:

link_to("Destroy", "http://www.example.com", method: :delete)
# => <a href='http://www.example.com' rel="nofollow" data-method="delete">Destroy</a>

Также вы можете задавать любые атрибуты ссылки, такие как target, rel, type:

link_to "External link", "http://www.rubyonrails.org/", target: "_blank", rel: "nofollow"
# => <a href="http://www.rubyonrails.org/" target="_blank" rel="nofollow">External link</a>

Устаревшие атрибуты Rails UJS

До Rails 7, Rails поставлялся с JavaScript-библиотекой @rails/ujs по умолчанию. После Rails 7 эта библиотека больше не включена по умолчанию. Эта библиотека интегрировалась со следующими параметрами:

  • confirm: 'question?' — Это позволит драйверу unobtrusive JavaScript запросить с указанным вопросом (в этом случае результирующий текст будет question?. Если пользователь согласен, ссылка обрабатывается обычно, в противном случае действие не выполняется.

  • :disable_with — Значение этого параметра будет использоваться в качестве имени для отключенной версии ссылки. Эта функция предоставляется драйвером unobtrusive JavaScript.

    link_to «Посетить другой сайт», «www.rubyonrails.org/», data: { confirm: “Вы уверены?” } # => <a href=“www.rubyonrails.org/” data-confirm=“Вы уверены?”>Посетить другой сайт</a>

link_to_if(condition, name, options = {}, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/url_helper.rb, line 473
def link_to_if(condition, name, options = {}, html_options = {}, &block)
  if condition
    link_to(name, options, html_options)
  else
    if block_given?
      block.arity <= 1 ? capture(name, &block) : capture(name, options, html_options, &block)
    else
      ERB::Util.html_escape(name)
    end
  end
end

Создаёт ссылку с заданным name используя URL, созданный набором options, если condition истинно, иначе возвращает только имя. Для специализации стандартного поведения можно передать блок, принимающий имя или полный список аргументов для link_to_if.

Примеры

<%= link_to_if(@current_user.nil?, "Login", { controller: "sessions", action: "new" }) %>
# If the user isn't logged in...
# => <a href="/sessions/new/">Login</a>

<%=
   link_to_if(@current_user.nil?, "Login", { controller: "sessions", action: "new" }) do
     link_to(@current_user.login, { controller: "accounts", action: "show", id: @current_user })
   end
%>
# If the user isn't logged in...
# => <a href="/sessions/new/">Login</a>
# If they are logged in...
# => <a href="/accounts/show/3">my_username</a>
link_to_unless(condition, name, options = {}, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/url_helper.rb, line 450
def link_to_unless(condition, name, options = {}, html_options = {}, &block)
  link_to_if !condition, name, options, html_options, &block
end

Создаёт ссылку с заданным name используя URL, созданный набором options, если condition ложно, иначе возвращает только имя. Для специализации стандартного поведения (например, отображения ссылки входа вместо простого текста), вы можете передать блок, который принимает имя или весь список аргументов для link_to_unless.

Примеры

<%= link_to_unless(@current_user.nil?, "Reply", { action: "reply" }) %>
# If the user is logged in...
# => <a href="/controller/reply/">Reply</a>

<%=
   link_to_unless(@current_user.nil?, "Reply", { action: "reply" }) do |name|
     link_to(name, { controller: "accounts", action: "signup" })
   end
%>
# If the user is logged in...
# => <a href="/controller/reply/">Reply</a>
# If not...
# => <a href="/accounts/signup">Reply</a>
END_OF_DOCUMENT_MARKER
link_to_unless_current(name, options = {}, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/url_helper.rb, line 426
def link_to_unless_current(name, options = {}, html_options = {}, &block)
  link_to_unless current_page?(options), name, options, html_options, &block
end

Создаёт тег ссылки с заданным name используя URL, созданный набором options, если текущий URI запроса не совпадает с ссылками, в противном случае возвращается только имя (или выводится блок, если он существует). Вы можете предоставить link_to_unless_current блок, который специализирует стандартное поведение (например, отобразить ссылку «Начать здесь» вместо текста ссылки).

Примеры

Предположим, у вас есть меню навигации…

<ul id="navbar">
  <li><%= link_to_unless_current("Home", { action: "index" }) %></li>
  <li><%= link_to_unless_current("About Us", { action: "about" }) %></li>
</ul>

Если в действии «о нас», оно будет отображать…

<ul id="navbar">
  <li><a href="/controller/index">Home</a></li>
  <li>About Us</li>
</ul>

…но если в действии «индекс», оно будет отображать:

<ul id="navbar">
  <li>Home</li>
  <li><a href="/controller/about">About Us</a></li>
</ul>

Неявный блок, переданный link_to_unless_current, оценивается, если текущее действие равно заданному действию. Таким образом, если у нас есть страница комментариев и нам нужно отобразить ссылку «Назад», а не ссылку на страницу комментариев, мы можем сделать что-то вроде этого…

<%=
    link_to_unless_current("Comment", { controller: "comments", action: "new" }) do
       link_to("Go back", { controller: "posts", action: "index" })
    end
 %>
mail_to(email_address, name = nil, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/url_helper.rb, line 523
def mail_to(email_address, name = nil, html_options = {}, &block)
  html_options, name = name, nil if name.is_a?(Hash)
  html_options = (html_options || {}).stringify_keys

  extras = %w{ cc bcc body subject reply_to }.map! { |item|
    option = html_options.delete(item).presence || next
    "#{item.dasherize}=#{ERB::Util.url_encode(option)}"
  }.compact
  extras = extras.empty? ? "" : "?" + extras.join("&")

  encoded_email_address = ERB::Util.url_encode(email_address).gsub("%40", "@")
  html_options["href"] = "mailto:#{encoded_email_address}#{extras}"

  content_tag("a", name || email_address, html_options, &block)
end

Создаёт тег ссылки mailto для указанного email_address, который также используется в качестве имени ссылки, если name не указан. Дополнительные HTML-атрибуты для ссылки могут быть переданы в html_options.

mail_to имеет несколько методов для настройки самого электронного письма путём передачи специальных ключей в html_options.

Параметры

  • :subject - Устанавливает тему электронного письма.

  • :body - Устанавливает тело электронного письма.

  • :cc - Добавляет дополнительные получателей в качестве копий.

  • :bcc - Добавляет дополнительных получателей в качестве скрытых копий.

  • :reply_to - Устанавливает поле «Ответ» электронного письма.

Защита

До Rails 4.0, mail_to предоставляло варианты кодирования адреса для затруднения сбора адресов спам-ботами. Чтобы воспользоваться этими вариантами, установите gem actionview-encoded_mail_to.

Примеры

mail_to "me@domain.com"
# => <a href="mailto:me@domain.com">me@domain.com</a>

mail_to "me@domain.com", "My email"
# => <a href="mailto:me@domain.com">My email</a>

mail_to "me@domain.com", cc: "ccaddress@domain.com",
         subject: "This is an example email"
# => <a href="mailto:me@domain.com?cc=ccaddress@domain.com&subject=This%20is%20an%20example%20email">me@domain.com</a>

Вы также можете использовать блок, если целевой адрес ссылки сложно вписать в параметр имени. ERB пример:

<%= mail_to "me@domain.com" do %>
  <strong>Email me:</strong> <span>me@domain.com</span>
<% end %>
# => <a href="mailto:me@domain.com">
       <strong>Email me:</strong> <span>me@domain.com</span>
     </a>
phone_to(phone_number, name = nil, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/url_helper.rb, line 718
def phone_to(phone_number, name = nil, html_options = {}, &block)
  html_options, name = name, nil if name.is_a?(Hash)
  html_options = (html_options || {}).stringify_keys

  country_code = html_options.delete("country_code").presence
  country_code = country_code.nil? ? "" : "+#{ERB::Util.url_encode(country_code)}"

  encoded_phone_number = ERB::Util.url_encode(phone_number)
  html_options["href"] = "tel:#{country_code}#{encoded_phone_number}"

  content_tag("a", name || phone_number, html_options, &block)
end

Создаёт тег якоря TEL для указанного phone_number. При нажатии ссылки открывается приложение для звонков по умолчанию и заполняется телефонный номер.

Если name не указан, phone_number используется в качестве имени ссылки.

Поддерживается опция country_code, которая добавляет знак «плюс» и указанный код страны к телефонному номеру, связанному со ссылкой. Например, country_code: "01" добавит +01 к связанному телефонному номеру.

Дополнительные HTML-атрибуты для ссылки можно передать через html_options.

Параметры

  • :country_code - Добавляет код страны к телефонному номеру

Примеры

phone_to "1234567890"
# => <a href="tel:1234567890">1234567890</a>

phone_to "1234567890", "Phone me"
# => <a href="tel:1234567890">Phone me</a>

phone_to "1234567890", country_code: "01"
# => <a href="tel:+011234567890">1234567890</a>

Вы также можете использовать блок, если целевой адрес ссылки сложно вписать в параметр имени. Пример ERB:

<%= phone_to "1234567890" do %>
  <strong>Phone me:</strong>
<% end %>
# => <a href="tel:1234567890">
       <strong>Phone me:</strong>
     </a>
sms_to(phone_number, name = nil, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/url_helper.rb, line 667
def sms_to(phone_number, name = nil, html_options = {}, &block)
  html_options, name = name, nil if name.is_a?(Hash)
  html_options = (html_options || {}).stringify_keys

  country_code = html_options.delete("country_code").presence
  country_code = country_code ? "+#{ERB::Util.url_encode(country_code)}" : ""

  body = html_options.delete("body").presence
  body = body ? "?&body=#{ERB::Util.url_encode(body)}" : ""

  encoded_phone_number = ERB::Util.url_encode(phone_number)
  html_options["href"] = "sms:#{country_code}#{encoded_phone_number};#{body}"

  content_tag("a", name || phone_number, html_options, &block)
end

Создаёт тег ссылки SMS для указанного phone_number. При нажатии ссылки открывается приложение для отправки SMS по умолчанию, готовое отправить сообщение на указанный телефонный номер. Если указана опция body, содержание сообщения будет установлено как body.

Если name не указан, phone_number используется в качестве имени ссылки.

Поддерживается опция country_code, которая добавляет знак «плюс» и указанный код страны к телефонному номеру, связанному со ссылкой. Например, country_code: "01" добавит +01 к связанному телефонному номеру.

Дополнительные HTML-атрибуты для ссылки можно передать через html_options.

Параметры

  • :country_code - Добавляет код страны к телефонному номеру.

  • :body - Устанавливает тело сообщения.

Примеры

sms_to "5155555785"
# => <a href="sms:5155555785;">5155555785</a>

sms_to "5155555785", country_code: "01"
# => <a href="sms:+015155555785;">5155555785</a>

sms_to "5155555785", "Text me"
# => <a href="sms:5155555785;">Text me</a>

sms_to "5155555785", body: "I have a question about your product."
# => <a href="sms:5155555785;?body=I%20have%20a%20question%20about%20your%20product">5155555785</a>

Вы также можете использовать блок, если целевой адрес ссылки сложно вписать в параметр имени. Пример ERB:

<%= sms_to "5155555785" do %>
  <strong>Text me:</strong>
<% end %>
# => <a href="sms:5155555785;">
       <strong>Text me:</strong>
     </a>

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

Spec-Zone.ru

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