класс ActiveSupport::Inflector::Inflections
Флексии Active Support
Экземпляр-одиночка этого класса возвращается методом Inflector.inflections. Его можно использовать для задания дополнительных правил словоизменения. Если передать необязательную локаль, можно задать правила для других языков. Локаль по умолчанию — :en. Предоставляются правила только для английского языка.
ActiveSupport::Inflector.inflections(:en) do |inflect| inflect.plural /^(ox)$/i, '\1\2en' inflect.singular /^(ox)en/i, '\1' inflect.irregular 'cactus', 'cacti' inflect.uncountable 'equipment' end
Новые правила добавляются в начало. Поэтому в приведённом выше примере нерегулярное правило для cactus станет первым из выполняемых правил образования множественного и единственного числа. Это гарантирует, что ваши правила будут выполняться раньше любых уже загруженных правил.
Атрибуты
Публичные методы класса
# File activesupport/lib/active_support/inflector/inflections.rb, line 77 def self.instance(locale = :en) return @__en_instance__ ||= new if locale == :en @__instance__[locale] ||= new end
# File activesupport/lib/active_support/inflector/inflections.rb, line 83
def self.instance_or_fallback(locale)
return @__en_instance__ ||= new if locale == :en
I18n.fallbacks[locale].each do |k|
return @__en_instance__ if k == :en && @__en_instance__
return @__instance__[k] if @__instance__.key?(k)
end
instance(locale)
end # File activesupport/lib/active_support/inflector/inflections.rb, line 97
def initialize
@plurals, @singulars, @uncountables, @humans, @acronyms = [], [], Uncountables.new, [], {}
define_acronym_regex_patterns
end Публичные методы экземпляра
# File activesupport/lib/active_support/inflector/inflections.rb, line 159 def acronym(word) @acronyms[word.downcase] = word define_acronym_regex_patterns end
Задаёт новую аббревиатуру. Аббревиатуру следует указывать в том виде, в котором она будет отображаться в строке в стиле camelCase. Строка с подчёркиваниями, содержащая аббревиатуру, сохранит её при передаче в camelize, humanize или titleize. Строка в стиле camelCase, содержащая аббревиатуру, сохранит её при преобразовании в заголовок или удобочитаемый вид, а при передаче в underscore аббревиатура преобразуется в единое слово в нижнем регистре без разделителей.
acronym 'HTML' titleize 'html' # => 'HTML' camelize 'html' # => 'HTML' underscore 'MyHTML' # => 'my_html'
Однако для распознавания при преобразовании аббревиатура должна встречаться как отдельная единица, отделённая разделителями, а не быть частью другого слова:
acronym 'HTTP' camelize 'my_http_delimited' # => 'MyHTTPDelimited' camelize 'https' # => 'Https', not 'HTTPs' underscore 'HTTPS' # => 'http_s', not 'https' acronym 'HTTPS' camelize 'https' # => 'HTTPS' underscore 'HTTPS' # => 'https'
Примечание. Аббревиатуры, передаваемые в pluralize, больше не будут распознаваться, поскольку в результате образования множественного числа аббревиатура не будет отдельной единицей, отделённой разделителями. Чтобы обойти это ограничение, необходимо также указать форму множественного числа как аббревиатуру:
acronym 'API'
camelize(pluralize('api')) # => 'Apis'
acronym 'APIs'
camelize(pluralize('api')) # => 'APIs'
acronym можно использовать для указания любого слова, содержащего аббревиатуру или требующего сохранения нестандартного регистра. Единственное ограничение: слово должно начинаться с заглавной буквы.
acronym 'RESTful' underscore 'RESTful' # => 'restful' underscore 'RESTfulController' # => 'restful_controller' titleize 'RESTfulController' # => 'RESTful Controller' camelize 'restful' # => 'RESTful' camelize 'restful_controller' # => 'RESTfulController' acronym 'McDonald' underscore 'McDonald' # => 'mcdonald' camelize 'mcdonald' # => 'McDonald'
# File activesupport/lib/active_support/inflector/inflections.rb, line 248
def clear(scope = :all)
case scope
when :all
clear(:acronyms)
clear(:plurals)
clear(:singulars)
clear(:uncountables)
clear(:humans)
when :acronyms
@acronyms = {}
define_acronym_regex_patterns
when :uncountables
@uncountables = Uncountables.new
when :plurals, :singulars, :humans
instance_variable_set "@#{scope}", []
end
end Удаляет загруженные правила словоизменения в указанной области (по умолчанию — :all). Укажите область символом, обозначающим тип правила словоизменения. Возможные значения: :plurals, :singulars, :uncountables, :humans, :acronyms.
clear :all clear :plurals
# File activesupport/lib/active_support/inflector/inflections.rb, line 237 def human(rule, replacement) @humans.prepend([rule, replacement]) end
Задаёт удобочитаемую форму строки с помощью правила на основе регулярного выражения или отображения строк. При замене на основе регулярного выражения после замены применяется обычное форматирование метода humanize. Если используется строка, удобочитаемую форму следует задать в желаемом виде (например, «The name», а не «the_name»).
human /_cnt$/i, '\1_count' human 'legacy_col_person_name', 'Name'
# File activesupport/lib/active_support/inflector/inflections.rb, line 191
def irregular(singular, plural)
@uncountables.delete(singular)
@uncountables.delete(plural)
s0 = singular[0]
srest = singular[1..-1]
p0 = plural[0]
prest = plural[1..-1]
if s0.upcase == p0.upcase
plural(/(#{s0})#{srest}$/i, '\1' + prest)
plural(/(#{p0})#{prest}$/i, '\1' + prest)
singular(/(#{s0})#{srest}$/i, '\1' + srest)
singular(/(#{p0})#{prest}$/i, '\1' + srest)
else
plural(/#{s0.upcase}(?i)#{srest}$/, p0.upcase + prest)
plural(/#{s0.downcase}(?i)#{srest}$/, p0.downcase + prest)
plural(/#{p0.upcase}(?i)#{prest}$/, p0.upcase + prest)
plural(/#{p0.downcase}(?i)#{prest}$/, p0.downcase + prest)
singular(/#{s0.upcase}(?i)#{srest}$/, s0.upcase + srest)
singular(/#{s0.downcase}(?i)#{srest}$/, s0.downcase + srest)
singular(/#{p0.upcase}(?i)#{prest}$/, s0.upcase + srest)
singular(/#{p0.downcase}(?i)#{prest}$/, s0.downcase + srest)
end
end Задаёт новое неправильное правило, одновременно применяемое при образовании множественного и единственного числа. Это правило можно использовать только со строками, но не с регулярными выражениями. Достаточно передать неправильную форму в единственном и множественном числе.
irregular 'cactus', 'cacti' irregular 'person', 'people'
# File activesupport/lib/active_support/inflector/inflections.rb, line 168 def plural(rule, replacement) @uncountables.delete(rule) if rule.is_a?(String) @uncountables.delete(replacement) @plurals.prepend([rule, replacement]) end
Задаёт новое правило образования множественного числа и строку замены. Правило может быть строкой или регулярным выражением. Замена всегда должна быть строкой и может содержать ссылки на данные, соответствующие правилу.
# File activesupport/lib/active_support/inflector/inflections.rb, line 178 def singular(rule, replacement) @uncountables.delete(rule) if rule.is_a?(String) @uncountables.delete(replacement) @singulars.prepend([rule, replacement]) end
Задаёт новое правило образования единственного числа и строку замены. Правило может быть строкой или регулярным выражением. Замена всегда должна быть строкой и может содержать ссылки на данные, соответствующие правилу.
# File activesupport/lib/active_support/inflector/inflections.rb, line 225 def uncountable(*words) @uncountables.add(words) end
Задаёт неисчисляемые слова, которые не должны подвергаться словоизменению.
uncountable 'money' uncountable 'money', 'information' uncountable %w( money information rice )
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.