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.
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
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
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
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
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"
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:
-
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
-
W poniższym kodzie wywołany jest układ formula_1 dla wszystkich akcji kontrolera Users.
class UsersController < ApplicationController layout "application_1" end
-
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
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.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