¿Diseños de rieles por acción?


Utilizo un diseño diferente para algunas acciones (principalmente para la nueva acción en la mayoría de los controladores).

Me pregunto cuál sería la mejor manera de especificar el diseño? (Estoy usando 3 o más diseños diferentes en el mismo controlador)

No me gusta usar

Render: layout = > 'name'

Me gustó hacer

Layout 'name',: only = > [: new]

Pero no puedo usar eso para especificar 2 o más diseños diferentes.

Para ejemplo:

Cuando llamo a layout 2 veces en el mismo controlador, con diferentes nombres de layout y diferentes opciones solamente, la primera se ignora - esas acciones no se muestran en el layout que especifiqué.

Nota: Estoy usando Rails 2.

Author: Andrew Hendrie, 2010-06-11

7 answers

Puede usar un método para establecer el diseño.

class MyController < ApplicationController
  layout :resolve_layout

  # ...

  private

  def resolve_layout
    case action_name
    when "new", "create"
      "some_layout"
    when "index"
      "other_layout"
    else
      "application"
    end
  end
end
 271
Author: August Lilleaas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-11 19:58:08
class ProductsController < ApplicationController
   layout "admin", only: [:new, :edit]
end

O

class ProductsController < ApplicationController
   layout "application", only: [:index]
end
 178
Author: axeltaglia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-18 12:00:26

Puede especificar el diseño de una acción individual usando respond_to :

  def foo
    @model = Bar.first
    respond_to do |format|
      format.html {render :layout => 'application'}
    end
  end
 45
Author: Gavin Terrill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 05:46:14

También puede especificar el diseño para la acción usando render:

def foo
  render layout: "application"
end
 9
Author: yottanami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-24 09:04:03

Hay una gema (layout_by_action) para eso:)

layout_by_action [:new, :create] => "some_layout", :index => "other_layout"

Https://github.com/barelyknown/layout_by_action

 8
Author: barelyknown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 23:45:35

Varias formas de especificar el layout bajo el controlador:

  1. En el siguiente código, application_1 layout se llama bajo index y show action of Users controller y application layout(default layout) se llama para otras acciones.

    class UsersController < ApplicationController
      layout "application_1", only: [:index, :show]
    end
    
  2. En el siguiente código, se llama a application_1 layout para todas las acciones del controlador de usuarios.

    class UsersController < ApplicationController
       layout "application_1"
    end
    
  3. En el siguiente código, application_1 layout se llama para la acción de prueba de los controladores de usuarios solamente y para todos se llama a otro diseño de aplicación de acción (predeterminado).

        class UsersController < ApplicationController
          def test
            render layout: "application_1"
          end
        end
    
 7
Author: puneet18,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-11 06:57:53

Precisión :

Una forma no realmente pero de trabajo SECO es lo que ves arriba, pero con una precisión : el diseño debe estar después de tus variables para trabajar ("@some"). As:

def your_action
   @some = foo
   render layout: "your_layout"
end

Y no:

def your_action
   render layout: "your_layout"
   @some = foo
   @foo = some
end

Si haces un before_action... tampoco funcionará.

Espero que ayude.

 0
Author: Gregdebrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-17 12:41:25