Просто любопытно, знает ли кто-нибудь, что Ruby-техника используется для выполнения следующего в Rails-инфраструктуре.
Если я не пишу, скажем, метод index
на контроллере Rails, Rails все равно будет отображать файл индекса, если URL-адрес соответствует этому маршруту. Это имеет смысл, потому что мой контроллер наследует родительский класс, который должен иметь свой собственный метод index
.
Однако, если я сделать определить метод 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 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 использует какой-то метод метапрограммирования, чтобы гарантировать, что мои методы контроллера вызовут super
. Если да, может ли кто-нибудь объяснить это? Можете ли вы указать на исходный код, который делает это?
Update
Как отметил Младен Ябланович, моя первоначальная ментальная модель была неправильной; метод контроллера обычно не отображает представление; вместо этого и метод контроллера и рендеринг вида вызывается некоторым кодом инфраструктуры. Это очевидно, потому что я могу создать метод контроллера с любым именем - например, search
- и будет отображаться представление search
. Так что я не переопределяю родительский метод в этом случае, а некоторый код рамки анализирует имя метода контроллера и ищет подходящий вид.
Тем не менее, структура должна быть способна определить, уже или нет метод контроллера render
. Так что еще одна маленькая загадка для меня.