Как я могу получить controller_name для подкласса контроллера от его родителя? - PullRequest
0 голосов
/ 14 февраля 2011

Я использую некоторые контроллеры пространства имен, которые также наследуются от родительского контроллера.В каждом подклассе мне нужно иметь ( для всех, кто интересуется, почему ... ):

class Fruits::ApplesController < FruitsController
  # controller_name below is 'apples'
  require_dependency "fruits/#{controller_name}"
  ...
end

Итак, так как я предпочел бы иметь строку require_dependency один раз в моем родительском классе, я попробовалчтобы переместить его в FruitsController, но проблема в том, что имя_контроллера теперь равно "fruits" ..

class FruitsController < ApplicationController
  # controller_name is 'fruits' no matter which subclassed controller is called
  require_dependency "fruits/#{controller_name}"
  ...
end

Так как я могу правильно получить значение имени подкласса контроллера в FruitsController, чтобы я могсохранить эту строку require_dependency из моих подклассов?controller_path тоже не помогает.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

Как написано, ваш оператор require_dependency выполняется только один раз, когда загружается родительский элемент.

Вы можете потенциально использовать унаследованный метод Class #, чтобы требовать зависимости, как этот (код не проверен).

class FruitsController < ApplicationController
  def self.inherited(subclass)
    subclass.require_dependency subclass.to_s.underscore
  end
end
0 голосов
/ 14 февраля 2011

Как я уже упоминал выше в своем ответе @ElliotNelson (спасибо большое!), Вот код, который я поместил в мой FruitsController, который позволил мне пересмотреть исходный код:

def self.inherited(subclass)    
  subclass.require_dependency subclass.controller_name
  super
end
0 голосов
/ 14 февраля 2011

Указанное выше требование require в классе Fruits выполняется только один раз во время загрузки родительского класса, что означает, что подклассы больше не будут выполняться. Проверьте следующий пример:

class A
  puts name
end

class B < A
end
#=> A

Итак, вы должны выполнить отдельное требование для каждого подкласса, и, таким образом, вы не можете рефакторировать его так, как хотите.

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