Одна из идиоматических конструкций в Ruby – функция, принимающая последним параметром хеш. Обычно этот хеш содержит опции. Такое часто встречается и во встроенных функциях, и в библиотеках:
# link_to(body, url, html_options = {})
link_to 'blog', 'https://ru.hexlet.io/blog', { id: 'news', class: 'article' }
# <a href="https://ru.hexlet.io/blog" class="article" id="news">blog</a>
В Ruby добавлен «синтаксический сахар», позволяющий опускать скобки в подобных ситуациях. Вызов выше в реальном коде выглядит так:
link_to 'blog', 'https://ru.hexlet.io/blog', id: 'news', class: 'article'
К такому способу записи нужно немного привыкнуть, так как может быть не сразу понятно, что к чему относится. Но потом станет видно, насколько он удобен и практичен. Это ещё одна из его «фишек», которая помогает строить языки предметной области (DSL). Из-за небольшого количества дополнительного синтаксиса код на Ruby может выглядеть просто, как текст. Ниже пример роутинга (отвечает за формирование адресов страниц сайта) из Rails:
# В большинстве других языков подобная конструкция либо невозможна,
# либо получится в разы сложнее и загроможденнее символами
resources :companies, only: [:show, :edit, :update, :destroy] do
resources :orders, only: [:create] do
member do
get :payment
end
end
end
Реализуйте функцию link_to()
, которая генерирует html-ссылки. Функция принимает на вход три параметра:
link_to 'name', '/url'
# <a href="/url">name</a>
link_to 'name', '/url', class: 'link'
# <a href="/url" class="link">name</a>
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1# frozen_string_literal: true
2
3require 'test_helper'
4require_relative 'index'
5
6describe 'function' do
7 it 'should works' do
8 actual1 = link_to 'name', '/url'
9 expected1 = '<a href="/url">name</a>'
10 assert { actual1 == expected1 }
11
12 actual2 = link_to 'name', '/url', class: 'link'
13 expected2 = '<a href="/url" class="link">name</a>'
14 assert { actual2 == expected2 }
15 end
16end
17
Решение учителя откроется через: