Как извлечь класс контроллера из представления / помощника в Rails 3? - PullRequest
0 голосов
/ 15 декабря 2011

Я знаю о controller_name возврате строки, содержащей имя контроллера, но как я могу получить класс контроллера (или объект) из помощника?

РЕДАКТИРОВАТЬ: Решение должнотакже работает, когда контроллер находится в пространстве имен (например, Admin::PostsController)

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

Вы можете использовать метод constantize, например:

controller_name.constantize

Хотя я не уверен, как он будет себя вести, если у вас есть контроллер пространства имен.:

Это не будет работать для всех имен контроллеров и / или пространств имен.Хотя можно использовать метод #controller в сочетании с #class:

controller.class
1 голос
/ 15 декабря 2011

Вид, вероятно, не должен делать это.В идеале все, что вы пытаетесь сделать в представлении, которое ожидает этого, вы должны вместо этого делать в контроллере.

Пытаясь подумать, почему вы хотите это сделать, лучший ответ, который я могу придумать, - эточто вы хотите вызвать вспомогательный метод, который вы определили в контроллере.Для этого уже существует конструкция, использующая helper_method .

В большинстве случаев контроллер должен предоставлять эти данные представлению.Не вид, вытаскивая его из контроллера.(например, даже если вам не нужен класс, контроллер может предоставить ему @controller_class = self.class, который затем будет доступен для просмотра)

1 голос
/ 15 декабря 2011

В чистом Ruby, поскольку имена классов являются константами, вы можете сделать это, чтобы получить класс из строки:

classname = 'Posts'
p Kernel.const_get(classname).methods

В Rails есть хороший ярлык, constantize только для этого:

p 'Posts'.constantize.methods

Если имя класса, например, 'editable_file', сначала вызовите метод camelize:

p 'editable_file'.camelize.constantize  # EditableFile
p 'extensions/editable_file'.camelize.constantize  # Extensions::EditableFile

РЕДАКТИРОВАТЬ: Если вы действительно хотите получить имя контроллера не демодулированным,этот код в config/initializers/controller_name.rb должен обеспечить это:

class ActionController::Metal
  def self.controller_name
    # @controller_name ||= self.name.demodulize.sub(/Controller$/, '').underscore
    @controller_name ||= self.name.sub(/Controller$/, '').underscore
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...