как использовать «constantize» в пользовательском модуле контроллера - PullRequest
1 голос
/ 09 августа 2009

У меня есть такой модуль:

module Controller
  module LocaleModels
    def self.included(base)
      base.send :include, InstanceMethods
    end

    module InstanceMethods
      def locale_Lexeme; constantize_model('Lexeme') end
      def locale_Synthetic; constantize_model('Synthetic') end
      def locale_Property; constantize_model('Property') end

      private
      def constantize_model(common_part)
        eval(I18n.locale.capitalize + '::' + common_part).constantize
      end
    end
  end
end

Но я продолжал получать

NoMethodError (undefined method `constantize' for #<Class:0x2483b0c>)

Я думаю, я не могу использовать 'constantize' в пользовательском модуле.

Но не могли бы вы предложить какой-нибудь обходной путь?

Ответы [ 2 ]

5 голосов
/ 09 августа 2009

Метод constantize преобразует строку в константу (например, класс или модуль). Однако вызов eval уже возвращает класс, а не строку, так что в некотором смысле он уже выполняет то, что сделал бы constantize.

Я рекомендую удалить вызов eval, поскольку constantize гораздо безопаснее в использовании.

def constantize_model(common_part)
  (I18n.locale.capitalize + '::' + common_part).constantize
end

Таким образом, вы вызываете constantize в строке, как задумано.

0 голосов
/ 09 августа 2009

Проверьте, возвращает ли eval-вызов объект String. Если это действительно проверяет, находится ли это в верблюжьем корпусе. Попробуйте использовать camelize, если его нет в camelcase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...