Rails layouts na akcję?

Używam innego układu dla niektórych akcji (głównie dla nowej akcji w większości kontrolerów).

Zastanawiam się jaki byłby najlepszy sposób na określenie layoutu? (Używam 3 lub więcej różnych układów w tym samym kontrolerze)

Nie lubię używać

Render: layout = > 'Nazwa'

I liked doing

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

Ale nie mogę użyć tego do określenia 2 lub więcej różnych układów.

Dla przykład:

Gdy wywołuję layout 2 razy w tym samym kontrolerze, z różnymi nazwami układów i różnymi opcjami, pierwszy zostanie zignorowany - te akcje nie wyświetlają się w podanym przeze mnie układzie.

Uwaga: używam Rails 2.

Author: Andrew Hendrie, 2010-06-11

7 answers

Możesz użyć metody, aby ustawić układ.

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/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-11 19:58:08
class ProductsController < ApplicationController
   layout "admin", only: [:new, :edit]
end

Lub

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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-18 12:00:26

Możesz określić układ dla pojedynczej akcji za pomocą 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-20 05:46:14

Możesz również określić układ akcji za pomocą 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-24 09:04:03

Do tego jest gem (layout_by_action):)

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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-26 23:45:35

Różne sposoby określania układu pod kontrolerem:

  1. W poniższym kodzie wywoływany jest układ application_1 pod indeksem i show action kontrolera Users, a układ aplikacji(domyślny układ) jest wywoływany dla innych akcji.

    class UsersController < ApplicationController
      layout "application_1", only: [:index, :show]
    end
    
  2. W poniższym kodzie wywołany jest układ formula_1 dla wszystkich akcji kontrolera Users.

    class UsersController < ApplicationController
       layout "application_1"
    end
    
  3. W poniższym kodzie, układ formula_1 jest wywoływany tylko do akcji testowej kontrolerów użytkowników i dla wszystkich wywoływany jest inny układ aplikacji akcji (domyślny).

        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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 06:57:53

Precyzja:

Nie do końca, ale działający suchy sposób jest tym, co widzisz powyżej, ale z precyzją: układ musi być po zmiennych do pracy ("@some"). As:

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

A nie:

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

Jeśli wykonasz before_action... to też nie zadziała.

Mam nadzieję, że to pomoże.
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 12:41:25