Rails - 为部分渲染布局
Posted
技术标签:
【中文标题】Rails - 为部分渲染布局【英文标题】:Rails - rendering a layout for a partial 【发布时间】:2011-08-14 14:55:16 【问题描述】:这是我正在尝试做的一些模型代码:
class ApplicationController < ActionController::Base
layout "application"
end
class SomeController < ActionController::Base
verify :method => :get, :only => [:index]
def index
@some_objects = Some.collect
end
end
# Now in: views/some/index.html.erb
<% if @some_objects %>
# use the application layout
<%= render(:partial => 'some/objects', :locals => :some_objects => @some_objects) %>
<% else %>
# use a different layout than application
# some/sales_page --> views/some/_sales_page.html.erb
# layouts/sales --> views/layouts/sales.html.erb
<%= render('some/sales_page', :layout => 'layouts/sales') %>
<% end %>
如您所见,我正在尝试为部分 some/sales_page 呈现与应用程序不同的布局。我该怎么办?
注意:我的 Rails 版本是 2.3.11。
【问题讨论】:
【参考方案1】:这很简单,render
方法采用:layout
选项(基本上就是您的示例的方式),但是您的布局可以与调用文件位于同一目录中,并且它使用部分命名约定(即以下划线开头)。因此,在您的示例中,if 将类似于以下内容:
#In: views/some/index.html.erb
<% if @some_objects %>
# use the application layout
<%= render(:partial => 'objects', :locals => :some_objects => @some_objects) %>
<% else %>
<%= render(:partial => 'sales_page', :layout => 'sales_layout') %>
<% end %>
views/some
文件夹的内容将如下所示:
views/some/index.html.erb
views/some/_objects.html.erb
views/some/_sales_page.html.erb
views/some/_sales_layout.html.erb
有关该主题的更多信息,请查看this、this 和this。
【讨论】:
【参考方案2】:您只能在控制器层更改布局。
class SomeController < ActionController::Base
layout :choose_layout
verify :method => :get, :only => [:index]
def index
@some_objects = Some.collect
end
private
def choose_layout
@some_objects = Some.collect
@some_objects ? "application" : "different_layout"
end
end
【讨论】:
我投了反对票,因为You can change layout only in controller layer.
不准确。 render
方法接受一个模板。以上是关于Rails - 为部分渲染布局的主要内容,如果未能解决你的问题,请参考以下文章
通过渲染 Rails 部分创建 jquery html 对象