Хороший ночной отдых творит чудеса для мозга. Поэтому я проснулся, понимая, как это работает ... но также чувствовал себя глупо, потому что не видел этого раньше.
tl; dr - этот код находится внутри контроллера application
. Другие контроллеры не вызывают этот код. Вот почему он работает правильно.
Длинный ответ:
Rails пытается найти макеты на основе имени контроллера. Если макета не существует, то рельсы будут использовать макет application
.
Итак, в моих Home
контроллерах сначала ищется компоновка home
. Поскольку он есть, он использует этот макет.
Я не уверен, что делает devise, но он не ищет макет с именем devise
, поэтому вместо него используется макет application
. И вот тогда код выше работает. Так как контроллер является контроллером устройства, макет затем изменяется на «имя_компоновки_дизайна».