Релейные макеты для каждого действия?

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

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

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

render: layout = > 'name'

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

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

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

Например:

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

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

Ответ 1

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

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

Ответ 2

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

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

или же

class ProductsController < ApplicationController
   layout "application", only: [:index]
end

Ответ 3

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

  def foo
    @model = Bar.first
    respond_to do |format|
      format.html {render :layout => 'application'}
    end
  end

Ответ 4

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

def foo
  render layout: "application"
end

Ответ 6

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

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

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

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

        class UsersController < ApplicationController
          def test
            render layout: "application_1"
          end
        end
    

Ответ 7

Точность:

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

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

И не:

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

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

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