Как правильно генерировать динамические методы в Rails?

Не могу вьехать как заставить define_method работать:
Mongoid,
используются localized_fields
Всё хорошо, но в некоторых вопросах жутко неудобно работать:
Например, чтобы явно получить русскую версию поля name - мне нужно стучаться в name_translations[:ru] - что дико неудобно,
Или-же заниматься постоянным переключением локалей, например так:
curr = I18.locale
I18n.locale = :en
Model.name
I18n.locale = curr

Которое, кстати, не гарантирует что будет именно русская версия поля. В принципе это то ещё развлечение.
Пока-что количество localized-полей конечное, в принципе можно сделать просто
def name__ru и def name__ru(value)
Однако хотелось бы добиться чуть чуть другого поведения: Смотрим модель, и для каждого увиденного поля с параметром localized? = true
объявляем по правилам "#{name}__#{loc}" сетер и гетер.
Собственно написал следующий небольшой модуль (тут пока-что только getter).
module My::Localized
  module ClassMethods
    def params_localized
      self.attribute_names.each do |value|
        if self.fields[value].localized?
          I18n.available_locales.each do |loc|
            define_method("#{value}__#{loc}")  do
              self["#{value}_translations"][loc]
            end
          end
        end
      end
    end
  end
end

Но не могу сообразить - как заставить его работать при подключении в Model...
Сейчас вообще никак не работает...
  • Вопрос задан
  • 2532 просмотра
Пригласить эксперта
Ответы на вопрос 2
@vsuhachev
module My::Localized
  def self.params_localized
  end
end

и потом include My::Localized

Либо
module My::Localized
  def params_localized
  end
end

и потом extend My::Localized

Либо Concerns

PS:
Еще немного не по теме, ваш код со сменой локалей можно сделать более удобным
def with_locale(locale)
  old_locale = I18n.locale
  I18n.locale = locale
  begin
    yield
  ensure
    I18n.locale = old_locale
  end
end


Использование:
with_locale :ru do
  # ...
end
Ответ написан
Комментировать
@fuCtor
Ruby разработчик
Как подключаете модуль и как потом должен вызываться метод? А так можно использовать Concerns.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы