Ruby on Rails layouts... кроме и только ошибка

У меня есть контроллер со следующей логикой компоновки

layout 'sessions', :except => :privacy
  layout 'static', :only => :privacy

Проблема в том, что Rails, похоже, игнорирует первую строку кода, а макеты "сеансы" не применяются для каких-либо действий. Он просто думает сделать статический макет для обеспечения конфиденциальности и без макета для остальных.

Кто-нибудь знает, как это исправить?

Ответ 1

Другим вариантом является определение метода для вашего вызова макета, например:

layout :compute_layout

а затем

def compute_layout
  action_name == "privacy" ? "static" : "sessions" 
end

Однако это действительно полезно, когда вы хотите определить макет во время выполнения на основе некоторого параметра времени выполнения (например, заданной переменной). В вашем примере это не кажется необходимым.

Ответ 2

Причина, по которой это не работает, состоит в том, что для каждого контроллера может быть только одно глобальное объявление. Условия :only и :except просто различают действия, которые должны получить указанный макет, и те, которые исключены, получают рендеринг без макета. Другими словами, объявление макета всегда влияет на все действия, которые используют рендеринг по умолчанию.

Чтобы переопределить, вы просто указываете макет, когда вы выполняете как один из следующих примеров внутри действия:

render :layout => 'static'
render :action => 'privacy', :layout => 'static'
render :layout => false # Don't render a layout

Ответ 3

Вы можете просто указать layout :static, где он вам нужен.