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

о любопытно, если кто-нибудь знает, какая техника 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'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

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

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

Обновить

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

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

Ответы на вопрос(0)

Ваш ответ на вопрос