Просто любопытно, знает ли кто-нибудь, какая техника 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
. Так что это еще одна маленькая загадка для меня.