Module: Russian::RailsIntegration

Defined in:
lib/russian/russian_rails.rb

Overview

Installs Rails-specific patches exposed by the gem.

The integration is lazy: outside Rails it does nothing, and inside Rails it wires itself through ActiveSupport.on_load hooks and also patches framework components that are already loaded.

Устанавливает Rails-специфичные патчи, поставляемые gem’ом.

Интеграция сделана “ленивой”: вне Rails она ничего не делает, а внутри Rails подключается через ActiveSupport.on_load и дополнительно патчит уже загруженные части фреймворка.

Examples:

require "russian"
Russian::RailsIntegration.install!

Class Method Summary collapse

Class Method Details

.define_railtie!Object



86
87
88
89
90
91
92
93
94
95
# File 'lib/russian/russian_rails.rb', line 86

def define_railtie!
  return unless defined?(Rails::Railtie)
  return if defined?(Russian::Railtie)

  Russian.const_set(:Railtie, Class.new(Rails::Railtie) do
    initializer "russian.install" do
      Russian::RailsIntegration.install!
    end
  end)
end

.install!void

This method returns an undefined value.

Installs Rails hooks and applies patches to already loaded components.

The method is idempotent and safe to call more than once.

Устанавливает Rails-хуки и применяет патчи к уже загруженным компонентам.

Метод идемпотентен и безопасен для повторных вызовов.

Examples:

Russian::RailsIntegration.install!


39
40
41
42
43
44
45
46
47
# File 'lib/russian/russian_rails.rb', line 39

def install!
  return unless rails?

  define_railtie!
  install_hooks!

  patch_active_model! if defined?(ActiveModel::Error)
  patch_action_view! if defined?(ActionView::Helpers::DateTimeSelector)
end

.install_hooks!Object



50
51
52
53
54
55
56
57
# File 'lib/russian/russian_rails.rb', line 50

def install_hooks!
  return if @hooks_installed

  %i[active_model active_model_error].each { |hook| on_load(hook, :patch_active_model!) }
  on_load(:action_view, :patch_action_view!)

  @hooks_installed = true
end

.on_load(hook, patcher) ⇒ Object



60
61
62
# File 'lib/russian/russian_rails.rb', line 60

def on_load(hook, patcher)
  ActiveSupport.on_load(hook) { Russian::RailsIntegration.public_send(patcher) }
end

.patch!(target, extension) ⇒ Object



76
77
78
# File 'lib/russian/russian_rails.rb', line 76

def patch!(target, extension)
  target.prepend(extension) unless target < extension
end

.patch_action_view!Object



70
71
72
73
# File 'lib/russian/russian_rails.rb', line 70

def patch_action_view!
  patch!(ActionView::Helpers::DateHelper, Russian::ActionViewExt::Helpers::DateHelperPatch)
  patch!(ActionView::Helpers::DateTimeSelector, Russian::ActionViewExt::Helpers::DateTimeSelectorPatch)
end

.patch_active_model!Object



65
66
67
# File 'lib/russian/russian_rails.rb', line 65

def patch_active_model!
  patch!(ActiveModel::Error.singleton_class, Russian::ActiveModelExt::ErrorPatch)
end

.rails?Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/russian/russian_rails.rb', line 81

def rails?
  defined?(Rails::Railtie) && defined?(ActiveSupport) && ActiveSupport.respond_to?(:on_load)
end