Релейные макеты для каждого действия?
Я использую другой макет для некоторых действий (главным образом для нового действия в большинстве контроллеров).
Мне интересно, какой лучший способ указать макет? (Я использую 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
Ответ 5
Здесь есть камень (layout_by_action):)
layout_by_action [:new, :create] => "some_layout", :index => "other_layout"
https://github.com/barelyknown/layout_by_action
Ответ 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... это тоже не сработает.
Надеюсь, поможет.