Какую технику Ruby использует Rails, чтобы заставить мои методы контроллера отображать представления?

Просто любопытно, знает ли кто-нибудь, какая техника Ruby используется для выполнения следующих задач в среде Rails.

Если я не напишу, скажи, метод index на контроллере Rails, Rails по-прежнему будет отображать файл представления индекса, если URL-адрес соответствует этому маршруту. Это имеет смысл, потому что мой контроллер наследуется от родительского класса, который должен иметь свой собственный метод index .

Однако, если я действительно определяю индекс метод и только указать ему установить переменную экземпляра, он по-прежнему отображает соответствующее представление. Например:

def index
  @weasels = Weasel.all

  # If I omit this line, Rails renders the index anyway.
  # If this behavior is defined in the parent class's index method,
  # it seems that by overriding the method, my index wouldn't do it. 
  # I'm not explicitly calling super to get the method from 
  # ActionController::Base, but maybe Rails is doing something like that?
  render :index
end

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

Я предполагаю, что Rails использует какой-то метод метапрограммирования, чтобы гарантировать, что мои методы контроллера будут вызывать супер . Если да, то кто-нибудь может это объяснить? Можете ли вы указать на исходный код, который это делает?

Обновление

Как указал Младен Ябланович, моя первоначальная ментальная модель была неправильной; метод контроллера обычно не отображает представление; вместо этого оба метод контроллера и рендеринг вида вызываются некоторым кодом инфраструктуры. Это очевидно, потому что я могу создать метод контроллера с любым именем - например, search - и отобразится представление search . Итак, очевидно, что я не переопределяю родительский метод в этом случае, и некоторый код фреймворка анализирует имя метода контроллера и ищет соответствующее представление.

Тем не менее, фреймворк должен иметь возможность определять, имеет ли метод контроллера уже называется render . Так что это еще одна маленькая загадка для меня.

11
задан Nathan Long 20 December 2010 в 19:10
поделиться