Раскладки рельсов за действие? - PullRequest
159 голосов
/ 11 июня 2010

Я использую другой макет для некоторых действий (в основном для нового действия в большинстве контроллеров).

Мне интересно, каким будет лучший способ указать макет?(Я использую 3 или более разных макетов в одном контроллере)

Мне не нравится использовать

render: layout => 'name'

Мне понравилось делать

макет 'name',: only => [: new]

Но я не могу использовать это, чтобы указать 2 или более различных макетов,

Например:

Когда я вызываю макет 2 раза в одном и том же контроллере с разными именами макета и разными опциями, первый игнорируется - эти действия не отображаются в макетеЯ указал.

Примечание: я использую Rails 2.

Ответы [ 7 ]

282 голосов
/ 11 июня 2010

Вы можете использовать метод для установки макета.

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
190 голосов
/ 18 января 2014

Если вы выбираете только из двух макетов, вы можете использовать :only:

class ProductsController < ApplicationController
   layout "admin", only: [:new, :edit]
end

или

class ProductsController < ApplicationController
   layout "application", only: [:index]
end
46 голосов
/ 20 июня 2013

Вы можете указать макет для отдельного действия, используя response_to :

  def foo
    @model = Bar.first
    respond_to do |format|
      format.html {render :layout => 'application'}
    end
  end
11 голосов
/ 24 мая 2016

Вы также можете указать макет для действия с помощью рендера:

def foo
  render layout: "application"
end
8 голосов
/ 27 августа 2013

Для этого есть драгоценный камень (layout_by_action):

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

https://github.com/barelyknown/layout_by_action

7 голосов
/ 11 января 2017

Различные способы указания макета под контроллером:

  1. В следующем коде компоновка application_1 вызывается по индексу и показывается действие контроллера пользователя, а компоновка приложения (компоновка по умолчанию) вызывается для других действий.

    class UsersController < ApplicationController
      layout "application_1", only: [:index, :show]
    end
    
  2. В следующем коде макет application_1 вызывается для всех действий контроллера Users.

    class UsersController < ApplicationController
       layout "application_1"
    end
    
  3. В следующем коде макет application_1 вызывается только для тестового действия контроллеров Users и для всех остальных макетов приложения действия (по умолчанию).

        class UsersController < ApplicationController
          def test
            render layout: "application_1"
          end
        end
    
5 голосов
/ 17 мая 2018

Точность:

Не совсем, но работающий способ DRY - это то, что вы видите выше, но с точностью: макет должен быть после ваших переменных для работы ("@some"). As:

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

А не:

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

Если вы выполните before_action ... это тоже не сработает.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...