Eu uso um layout diferente para algumas ações (principalmente para a nova ação na maioria dos controladores).
Gostaria de saber qual seria a melhor maneira de especificar o layout? (Estou usando 3 ou mais layouts diferentes no mesmo controlador)
Eu não gosto de usar
render: layout => 'nome'
Eu gostei de fazer
layout 'name',: only => [: new]
Mas não posso usar isso para especificar dois ou mais layouts diferentes.
Por exemplo:
Quando chamo o layout duas vezes no mesmo controlador, com nomes de layout diferentes e opções diferentes, o primeiro é ignorado - essas ações não são exibidas no layout especificado.
Nota: estou usando o Rails 2.
ruby-on-rails
mrbrdo
fonte
fonte
Respostas:
Você pode usar um método para definir o layout.
fonte
layout Proc.new{ ['index', 'new', 'create'].include?(action_name) ? 'some_layout' : 'other_layout' }
Se você estiver selecionando apenas entre dois layouts, poderá usar
:only
:ou
fonte
(I am using 3 or more different layouts in the same controller)
. Esta resposta permite um layout e nenhum layout, não layouts diferentes.Você pode especificar o layout para uma ação individual usando respond_to :
fonte
layout "[...]" to the controller class only allows one statement effectively. If you have more than two layouts to deal with (say, admin, generic_app, tailored_app), you will experience
Render e / ou redirecionar foram chamados várias vezes nos erros desta ação; e você não tem escolha a não ser usar esta sugestão.format.html { render 'custom_index', layout: 'application' }
da mesma maneira.Você também pode especificar o layout da ação usando render:
fonte
Há uma gema (layout_by_action) para isso :)
https://github.com/barelyknown/layout_by_action
fonte
Várias maneiras de especificar o layout no controlador:
No código a seguir, o layout do aplicativo_1 é chamado no índice e mostra a ação do Controlador de usuários e o layout do aplicativo (layout padrão) é chamado para outras ações.
No código a seguir, o layout do aplicativo_1 é chamado para todas as ações do controlador Usuários.
No código a seguir, o layout do aplicativo_1 é chamado apenas para a ação de teste dos controladores de usuários e para todos os outros layouts do aplicativo de ação (padrão).
fonte
Precisão:
Uma maneira DRY não muito real, mas que funciona, é o que você vê acima, mas com precisão: o layout precisa seguir suas variáveis para trabalhar ("@algumas"). Como :
E não :
Se você fizer uma ação antes ... não funcionará também.
Espero que ajude.
fonte