Ruby — это объектно-ориентированный, интерпретируемый язык, изобретенный Юкихиро Мацумото в 1993 году, который вдохновлен Perl и Lisp. С самого начала Ruby был разработан для того, чтобы быть «радостью использования», что означает сильный акцент на удобочитаемости и элегантности.
Ruby on Rails, часто просто Rails, представляет собой среду веб-приложений с открытым исходным кодом, которая работает на языке программирования Ruby. Ruby on Rails призван подчеркнуть конвенциональную конфигурацию (CoC) и принцип быстрой разработки «Не повторяйся» (DRY). Rails — это мощная платформа, которая поможет вам стать более продуктивным и уверенным в себе.
Rails использует различные гемы, многие из которых сами по себе являются фреймворками, чтобы дать вам абстракции, которые помогают писать чистый и СУХОЙ код. Одним из этих драгоценных камней является ActiveSupport, который определяет себя на Rubygems.org как:
Инструментарий вспомогательных библиотек и расширений ядра Ruby, извлеченный из инфраструктуры Rails. Широкая поддержка многобайтовых строк, интернационализация, часовые пояса и тестирование.
По сути, ActiveSupport расширяет многие базовые классы Ruby для предоставления синтаксического сахара, используемого Rails. Давайте посмотрим на некоторые из этих абстракций и посмотрим, как они помогают (и вредят) вам как разработчику.
Хэш в рубине
Хэш — это словарь-коллекция уникальных ключей и их значений. Также называемые ассоциативными массивами, они похожи на массивы, но там, где массив использует в качестве индекса целые числа, хэш позволяет использовать любой тип объекта.
Пример хэша:
#initialize an empty hash colors colors = { } #add a color with key as red colors[:red] = "Red Color" #add a color with key as blue colors[:blue] = "Blue Color" #display the hash colors #=> {:red=>"Red Color", :blue=>"Blue Color"}
Значение конкретного ключа может быть получено из хеша:
Hash[key] or Hash.fetch(:key)
Если мы хотим получить значение для ключа :red
, то
colors[:red] #=> "Red Color"
Но если мы попробуем colors['red']
мы получим значение как nil
.
colors['red'] #=> nil
Это потому, что Hash по-разному обрабатывает символы и строки в ключах. Это можно объяснить далее, если мы добавим еще одно значение ключа в наш хэш.
colors['red'] = "Red color, here key is not a symbol"
Теперь, если мы попытаемся извлечь значение для ключа, он вернет наше новое значение.
colors['red'] #=> "Red color, but key is not a symbol" colors[:red] #=> "Red Color"
Рассмотрим пример, в котором у нас есть два хэша: a = {"red": "Red color"}
и b = {:red => "Red color"}
.
Если мы объединим эти два хэша, вот так
a.merge! b #=> {"red" => "Red color, :red => "RED COLOR"}
и попробуйте получить значения из хэша
a['red'] #=> "Red color" a[:red] #=> "RED COLOR"
результат не идеален, если не сказать больше.
Иногда это может немного сбивать с толку, особенно если вы работали с Rails. Rails позволяет вам получить доступ, например, к params[:name]
или params['name']
в действии контроллера получить одно и то же значение. Это связано с использованием Rails ActiveSupport::HashWithIndifferentAccess
вместо обычного Hash
.
HashWithIndifferentAccess
HashWithIndifferentAccess — это класс, определенный в ActiveSupport
который помогает нам преодолеть вышеупомянутую проблему. Здесь символы в ключах будут преобразованы в строки, поэтому мы можем извлечь значения из хэша, используя как символы, так и строки.
Пример:
(Если вы не используете Rails, не забудьте потребовать active_support)
require 'active_support/core_ext/hash/indifferent_access' colors = HashWithIndifferentAccess.new colors[:red] = "Red color" #Fetch the value using symbol colors[:red] #=> "Red color" #Fetch the value using string colors["red"] #=> "Red color"
Если мы хотим преобразовать существующий Hash
в HashWithIndifferentAccess
colors = { blue: 'Blue color', white: 'Red Color' }.with_indifferent_access
HashWithIndifferentAccess
используется всеми разработчиками Rails, иногда неосознанно.
ActiveSupport :: Инфлекторы
Inflectors
— это модуль, который поставляется вместе с ActiveSupport
и включен в ваше приложение Rails. Inflectors
предлагает много методов, которые полезны для разработчиков. Если мы хотим использовать модуль независимо в наших скриптах ruby, нам нужно включить модуль в наш код ruby следующим образом:
require 'active_support/inflector'
Некоторые из наиболее часто используемых и полезных инфлекторов объясняются здесь.
Camelize
Он преобразует строки в строки CamelCase. Это особенно полезно при работе с константами Ruby.
Пример:
'manu'.camlize #=> 'Manu'
Humanize
Этот метод использует регулярные выражения для преобразования строк в более удобочитаемые строки. Они могут быть использованы в URL, среди прочего.
Пример:
'author_id'.humanize #=> 'Author'
Titelize
Это создаст красивый и чистый, похожий на заголовок вывод после удаления специальных символов из строки
Пример:
'x-men: the last stand'.titleize #=> "X Men: The Last Stand"
Дополнительные методы можно найти в руководстве по Rails API, а подробности о коде можно найти на github.
Расширения ActiveSupport
ActiveSupport::Extensions
предлагают утилиты для расширения Ruby.
Эти расширения являются частью ядра ActiveSupport
и могут быть загружены в приложение Rails, включая active_support
. Если вам нужен только конкретный метод, включите его, выбрав его «черри», вот так:
require 'active_support/core_ext/object/try.rb'
Некоторые полезные методы, которые являются частью ActiveSupport::Extensions
, описаны ниже:
попробуйте метод
Метод try
является одним из наиболее полезных методов, включенных в ActiveSupport
. Вы можете использовать этот метод вместо блока, который проверяет, равен ли объект нулю, прежде чем вызывать метод для этого объекта.
Пример:
# without try if @user.first_name puts @user.first_name end # with try @user.try(:first_name)
Таким образом try
поможет нам избежать ненужных условных выражений.
Расширения для числовых
Форматирование
Используя этот метод, числа могут быть отформатированы различными способами.
Телефонные номера:
Пример:
5551234.to_s(:phone) # => 555-1234 1235551234.to_s(:phone) # => 123-555-1234 1235551234.to_s(:phone, area_code: true) # => (123) 555-1234 1235551234.to_s(:phone, delimiter: " ") # => 123 555 1234 1235551234.to_s(:phone, area_code: true, extension: 555) # => (123) 555-1234 x 555 1235551234.to_s(:phone, country_code: 1) # => +1-123-555-1234
валюта
Пример:
1234567890.50.to_s(:currency) # => $1,234,567,890.50 1234567890.506.to_s(:currency) # => $1,234,567,890.51 1234567890.506.to_s(:currency, precision: 3) # => $1,234,567,890.506
процент
Пример:
100.to_s(:percentage) # => 100.000% 100.to_s(:percentage, precision: 0) # => 100% 1000.to_s(:percentage, delimiter: '.', separator: ',') # => 1.000,000% 302.24398923423.to_s(:percentage, precision: 5) # => 302.24399%
Человеческие ценности
Пример:
123.to_s(:human) # => "123" 1234.to_s(:human) # => "1.23 Thousand" 12345.to_s(:human) # => "12.3 Thousand" 1234567.to_s(:human) # => "1.23 Million" 1234567890.to_s(:human) # => "1.23 Billion" 1234567890123.to_s(:human) # => "1.23 Trillion" 1234567890123456.to_s(:human) # => "1.23 Quadrillion"
Конверсии
приговорить
Этот метод преобразует массив слов в предложение.
Пример:
%w().to_sentence # => "" %w(Earth).to_sentence # => "Earth" %w(Earth Wind).to_sentence # => "Earth and Wind" %w(Earth Wind Fire).to_sentence # => "Earth, Wind, and Fire"
Дополнительные методы и подробное объяснение можно найти, просмотрев исходный код самой ActiveSupport .
Вывод
Многие из методов, которые являются частью Rails или включенных в него модулей, используются недостаточно. Один из лучших ресурсов для изучения этого — просмотр самого исходного кода.
—
Ману С Аджит