Привет мир!

"Привет мир!"

Казалось бы, с этой ниточки начинается крещение человека в мир программирования. Мое крещение программирования состоялось 32 дня назад, но каким-то образом мне удалось создать свою собственную программу CLI/ruby gem.

Мой CLI под названием «Романтические рестораны» был задуман как подарок на день рождения для моей подруги (привет, души ❤). Целью CLI было предоставить ей пронумерованный список романтических ресторанов в Нью-Йорке и красочное описание каждого ресторана с контактами. Информация. Оттуда желаемый конечный результат состоял в том, чтобы сделать заказ из выбранного ею варианта на наш ужин в честь Дня святого Валентина. Я выполнил первый шаг, концептуализировал и визуализировал то, что я хочу, чтобы моя программа делала, маленькая победа!

Следующим шагом было начать, именно здесь я столкнулся, пожалуй, с самым трудным шагом. Глядя на пустой шаблон gem, я внезапно начал сражаться с демоном, который настраивает ваши зависимости в Learn IDE. Сначала я подумал, что хотел бы делать это в локальной среде, но, увы, проект должен выполняться в предоставленной песочнице Learn IDE.

Руководствуясь Пошаговым руководством по созданию CLI Gem Ави Фломбаума, я сначала занимаюсь настройкой своей среды и файловой структуры. Bundle gem направляет меня на правильный путь. Под неусыпным руководством Ави я создаю свой драгоценный камень, а затем вижу ужасную стену красных ошибок.

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

Отлично, моя среда настроена, и вот я иду. Во-первых, начните метапрограммировать мой интерфейс cli. Я использую свои заметки, чтобы направлять себя, в результате чего я пишу три метода. Метод call будет использоваться для запуска моей программы. В методе list_restaurants пользователь увидит список ресторанов, извлеченный из выбранной мной веб-страницы. Метод restaurant_description будет предоставлять пользователю возможность выбрать ресторан, если ему или ей нужна дополнительная информация. Кроме того, я позаботился о том, чтобы включить условия в мой метод restaurant_description для выполнения функций, если пользователь захочет снова просмотреть список после просмотра описания или выйти из программы, которая запустит последний метод в моем файле cli, который называется до свидания. Я считаю, что это помогает обеспечить беспроблемный опыт для пользователя.

С установленной базовой функцией метода cli, хотя ее уточнение в дальнейшем обязательно, я смотрю на создание базовой функции очистки и создание нового объекта, который будет представлять мой ресторан с соответствующими атрибутами: именем и описанием. Благодаря Nokogiri я могу очистить свою веб-страницу, правильно определяя, какие теги мне нужно извлечь, однако я столкнулся с проблемой.

После длительного процесса изучения всего и потери моих новых обновлений (новичок git commit здесь) я обнаруживаю, что возвращаемое мной значение для doc.css(url) не возвращает то, что мне нужно. Вместо того, чтобы получить только название ресторана, я получаю массив строк, которые выглядят так: 1.restaurant, 2.restaurant. Чтобы исправить эту проблему, я призываю старый добрый встроенный синтаксис сбора для перебора каждого элемента и использования .css('ID')[1].text.strip для возврата правильных строковых значений в массиве. . Все, что осталось сделать, это установить это конечное значение для моей переменной restaurant_name, и первый атрибут бума установлен.

Второй атрибут, restaurant_description, оказывается намного проще благодаря простому дизайну/макету, предоставленному выбранной мной веб-страницей. Все, что нужно, это вызвать .css для моей переменной doc, doc хранит мое значение Nokogiri и выполнить итерацию по каждому элементу, чтобы удалить пробелы, используя .strip в начале каждой строки. Пробелы были обнаружены, когда я запустил ./bin/romantic_restaurants, который запускает мой интерфейс командной строки.

Отлично, теперь у меня есть два моих атрибута, подтвержденных через pry. Теперь я готов создать объект ресторана и применить к нему соответствующие атрибуты. Я использую self.new и присваиваю его переменной с именем restaurant. Затем я даю своему объекту его имя и атрибуты описания. После этого я сохраняю свой объект в своем методе self.all, который позволяет мне получить к нему доступ в моем CLI.

На этом этапе мне нужно создать переменную класса, которая позволит мне присвоить ей значение self.all, чтобы ее область действия была доступна для всего моего cli-файла. Следующий шаг был немного сложным, но Pry спас меня! С огромной благодарностью Ави за пошаговые видеоматериалы я убежден, что нужно использовать each.with_index. Стоит отметить разницу между each.with_index и each_with_index. Однако я спрашиваю себя, что я повторяю? Это должен быть массив, так где же мои массивы? У меня есть два массива в моем объекте. Мне нужно указать названия ресторанов, где имена? Они находятся в атрибуте name в моем объекте или в моем случае @restaurant.name. Эврика! Я могу перебрать @restaurant.name и опубликовать свой список. Экстаз, охвативший меня, когда я увидел свой список, аккуратно напечатанный в моем терминале, был сюрреалистичным.

Следующей задачей было вывести описание ресторана на основе выбора пользователя. Я знал, что для этого мне понадобятся gets и каким-то образом вернуть описание на основе ввода пользователя. Тем не менее, несколько важных вещей, о которых следует знать. Описания находятся в массиве, но индексы массива всегда начинаются с 0, что означает, что где-то мне нужно ввести -1, чтобы учесть характер индексов массива. Кроме того, gets возвращает строку, что означает, что если я хочу удовлетворить условию, согласно которому пользователь получает описание на основе предоставленного им целого числа, мне нужно преобразовать gets в целое число с помощью метода "to_i". Отлично, все, что осталось сделать, чтобы перечислить описание, это создать мое условие. Я использую удобный денди if и говорю своему методу поместить переменную с именем restaurant, которой будет присвоено значение index.to_i -1 массива @restaurant.description, если этот input.to_i больше 0, так как нет элементов в наш список будет помечен как 0. Однако я учитывал человеческий фактор. Что, если пользователь введет 0 или что-то еще, что, казалось бы, сломает программу, которую я включил в качестве последней части в мое условие, чтобы поставить Не уверен, что вы хотите, введите список или выйдите. list запустит метод list_restaurants, который будет отображать рестораны, а exit активирует последний метод в моем кли, называемый goodbye, который просто завершает программу, говоря: Увидимся позже.

В общем, мне очень понравился этот проект. Самым сложным для меня было начать с чистого листа. Я обратил особое внимание на рефакторинг моего кода позже и подумываю о разделении моей функции парсера и объекта на два разных класса. Это задача, которая будет выполнена после того, как я подарю готовую CLI-программу своей девушке в качестве одного из ее многочисленных подарков на день рождения :)