我对某些操作使用不同的布局(主要用于大多数控制器中的新操作).
我想知道指定布局的最佳方法是什么?(我在同一个控制器中使用3个或更多不同的布局)
我不喜欢用
渲染:layout =>'name'
我喜欢这样做
layout'name',:only => [:new]
但我无法使用它来指定2个或更多不同的布局.
例如:
当我在同一个控制器中调用布局2次,使用不同的布局名称和不同的选项时,第一个被忽略 - 这些操作不会显示在我指定的布局中.
注意:我正在使用Rails 2.
Aug*_*aas 289
您可以使用方法来设置布局.
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
Run Code Online (Sandbox Code Playgroud)
小智 193
class ProductsController < ApplicationController
layout "admin", only: [:new, :edit]
end
Run Code Online (Sandbox Code Playgroud)
要么
class ProductsController < ApplicationController
layout "application", only: [:index]
end
Run Code Online (Sandbox Code Playgroud)
小智 48
您可以使用respond_to指定单个操作的布局:
def foo
@model = Bar.first
respond_to do |format|
format.html {render :layout => 'application'}
end
end
Run Code Online (Sandbox Code Playgroud)
yot*_*ami 11
您还可以使用render指定操作的布局:
def foo
render layout: "application"
end
Run Code Online (Sandbox Code Playgroud)
那个有一个gem(layout_by_action):)
layout_by_action [:new, :create] => "some_layout", :index => "other_layout"
Run Code Online (Sandbox Code Playgroud)
https://github.com/barelyknown/layout_by_action
在控制器下指定布局的各种方法:
在下面的代码中,application_1布局在索引下调用,并显示用户控件的操作,并为其他操作调用应用程序布局(默认布局).
class UsersController < ApplicationController
layout "application_1", only: [:index, :show]
end
Run Code Online (Sandbox Code Playgroud)在以下代码中,将针对Users控制器的所有操作调用application_1布局.
class UsersController < ApplicationController
layout "application_1"
end
Run Code Online (Sandbox Code Playgroud)在以下代码中,仅对用户控制器的测试操作调用application_1布局,并调用所有其他操作应用程序布局(默认).
class UsersController < ApplicationController
def test
render layout: "application_1"
end
end
Run Code Online (Sandbox Code Playgroud)精度:
上面看到的是一种不是真正但有效的DRY方式,但是具有一定的精度:布局必须位于变量之后才能使用(“ @some”)。作为:
def your_action
@some = foo
render layout: "your_layout"
end
Run Code Online (Sandbox Code Playgroud)
并不是 :
def your_action
render layout: "your_layout"
@some = foo
@foo = some
end
Run Code Online (Sandbox Code Playgroud)
如果您执行before_action ...,那么它也将无法正常工作。
希望能帮助到你。