При создании проекта наличие большого ассортимента и выбора заставило меня задуматься. Что было бы круто и могло бы быть использовано другими людьми? Я подумал о своей предыдущей работе, когда я был выгульщиком собак, и тут меня осенило, почему бы не помочь в распространении информации об определенных типах собак в качестве проекта? Собаки, как и большинство животных, имеют много разных видов с огромным количеством информации о каждом, кроме того, кто не любит собак?

Планирование CLI (интерфейс командной строки) было сложным. Что я хотел, чтобы мой MVP (минимально жизнеспособный продукт) делал? Ну, во-первых, я хотел, чтобы он приветствовал того, кто решит его использовать, конечно, но кроме этого, как бы я рассказал биографию каждой собаки? Я решил собрать информацию с сайта Purina. Purina — это веб-сайт, который специализируется на кормах для домашних животных, но также имеет большую базу данных о породах собак. Поэтому я скопировал пару URL-адресов, используя что-то под названием Nokogiri (анализатор веб-сайтов, который позволяет мне получать информацию с веб-сайта). Итак, теперь, когда у меня был веб-сайт, с которого можно было получить данные, наступила большая часть. Собираем все вместе и создаем меню, чтобы любой пользователь мог вводить определенные ключевые слова для получения информации из моего интерфейса командной строки. Теперь самое сложное! Объяснение всего кода на английском языке!

Поэтому я назвал свою жемчужину как-то очень оригинально… Я назвал ее «собакой». Не лучшее имя, но что-то, что легко отслеживать в моих файлах. Теперь давайте шаг за шагом разберем мой код меню. Сначала я создал класс под названием «class Dog::CLI».

Затем я создал метод под названием «call», который сразу запустится для пользователя и вызовет еще два метода, list_dogs и menu.

Метод list_dogs вызывает строку, которая отображается для пользователя, говорящего «Список собак». Строка 11 вызывает другой файл ruby ​​с именем dog_bio.rb вместе с методом класса с именем «self.list» и привязывает его к переменной экземпляра, которую я решил назвать «собаки», чтобы не усложнять. Теперь, когда это сделано, я вызвал переменную экземпляра, затем заставил ее пройти через имя породы каждой собаки и отобразить его в строковой форме, чтобы пользователь мог видеть его с индексом (i), чтобы он отображался как:

Теперь о самом большом методе в моем проекте… методе меню!

Первая часть метода посвящена пользовательскому вводу. Я установил «ввод» на ноль, а затем использовал условие «пока» и установил его на ввод! = «выход». В рубиновых терминах «!=» означает «не равно», что означает, что если пользователь не вводит «выход», то он пропускает очень длинную строку и переходит к остальной части кода.

Теперь после цикла while. Есть код, в котором для ввода задано значение gets.chomp.downcase. Что это обозначает???

«получает» — это то, что вводит пользователь, а ruby ​​взаимодействует с тем, что пользователь решает ввести, при этом chomp удаляет определенные вещи в конце строки ввода пользователя, например «exit\n».chomp -> «exit». Наконец, нижний регистр помещает любой ввод пользователя в строку нижнего регистра, чтобы CLI было легче интерпретировать то, что запрашивает пользователь; вместо того, чтобы вводить «PUg» и не понимать CLI, он будет принят в нижнем регистре как «pug». На остальную часть очень длинного меню!

Теперь у нас есть еще одно условие, условие «если». Итак, теперь у нас есть if input.to_i › 0, что означает, что результат строки будет возвращен как целое число; поэтому, если пользователь ввел больше 0 символов, он продолжит ввод кода. Затем я создаю переменную с именем doggo и присваиваю ей экземпляр с именем dogs[input.to_i-1], а затем использую doggo в строке с puts «#{doggo.breed}», которая вызывает экземпляр и захватывает ключевое слово порождается из него и отображается для пользователя как таковое:

Elsif — это условие, которое следует за условием if. Таким образом, с вводом от пользователя программа создаст условие, чтобы увидеть, соответствует ли оно чему-либо из метода. Например, если условие было выполнено, в результате отобразится метод.

Допустим, пользователь вводит строку: «Мопс». Программа пропустит американскую эскимосскую собаку и ее результат (eskimo_bio), а затем приземлится с «pug» и предоставит пользователю результат «pug_bio». Результат на картинке выше.

Для метода под названием pug_bio мы собираемся разобрать его. Посмотрите, что происходит.

На первый взгляд, мы видим экземпляр, оператор if и используемый итератор. Давайте начнем со строки: put «Pug Bio» создает строку, чтобы пользователь мог видеть слова «Pug Bio» в качестве названия биографии. Метод экземпляра, который я создал, снова был собаками; Я установил экземпляр собаки с помощью файла DogBio и захватил список. Теперь, используя экземпляр собаки, мы перебираем его с помощью select вместе с_index(1), в рамках итерации мы затем используем оператор if, где, если индекс соответствует 2, мы затем возвращаем строку, соответствующую индексу, и доводим dog.bio до Пользователь. Но прямо перед тем, как мы его отправили, я решил вырезать индекс, что означает, что пользователь не получит индексный номер с биографией, а только биографию. Итак, .slice("#{dog.bio}") возвращает пользователю только биографию. Однако есть более простой способ вернуть только биографию. Когда я писал этот пост, я решил немного реорганизовать свой код, и вместо того, чтобы использовать слайс и сопоставлять индекс в строке, мы могли бы вместо этого просто использовать puts «#{dog.bio}», чтобы вернуть биографию мопса в Пользователь.

Все биометоды имеют примерно одинаковый тип стиля кодирования, поэтому шаблон немного совпадает, что меня не слишком радует, но эй! На данный момент это MVP!

В dog_bio.rb происходит вся магия, чтобы мой CLI работал правильно, и откуда я получаю всю эту информацию для анализа. Начнем с метода класса self.list:

self.list — это метод класса, который вызывает другой метод класса, который на самом деле! вызывает другие методы класса. Это много методов, вызываемых другим. Так что же происходит в scrape_dogs? Я создал пустой массив с именем dogs, затем перелопатил его несколькими методами и, наконец, снова вызвал со всеми остальными методами. Итак, теперь пустой массив больше не пуст! Он содержит все остальные методы в списке. Теперь о методах, помещаемых в массив.

Каждый из этих методов анализирует информацию с помощью Nokogiri, собирает информацию с веб-сайта и вводит ее в мое приложение. doc устанавливается на Nokogiri::HTML и открывает адрес веб-сайта. Doggo используется для создания нового идентификатора, затем мы используем doggo, чтобы установить его с породой, используя .breed, и анализируем его с помощью doc.search для поиска на веб-сайте конкретных деталей, а затем помещаем его в текст с помощью . текст. Позже мы делаем то же самое с био, а затем, в самом конце, вызываем догго, чтобы у нас был готовый продукт. Думайте об этом как о сборочной линии, нам нужна определенная информация, вложенная в наш конечный продукт, поэтому мы по очереди добавляем что-то новое, а затем вызываем ее, когда она готова!

Наконец, когда мы все настроили, мы идем в нашу папку bin и получаем Dog::CLI.new.call.

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

Благодаря этому мы вернулись к тому, с чего начали. Как я подошел к этой задаче. Это заняло некоторое время, и даже больше, я должен сказать, пытался объяснить это на бумаге на реальном английском языке! Это была большая борьба, чтобы убедиться, что все работает. Мне дали большой совет: «ВСЕГДА ПРОВЕРЯЙТЕ СВОЙ КОД! ДАЖЕ ЕСЛИ ЭТО МАЛЕНЬКОЕ ИЗМЕНЕНИЕ, ПРОВЕРЬТЕ!» Теперь я всегда тестирую свой код независимо от изменений.

Спасибо за чтение и надеюсь, что все, что я опубликовал, поможет вам! Не забудьте протестировать свой код!