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 - 为部分渲染布局的主要内容,如果未能解决你的问题,请参考以下文章

Ruby On Rails 部分渲染

将 Rails 部分渲染到图像

使用 Rails 助手渲染部分

通过渲染 Rails 部分创建 jquery html 对象

Rails 4:部分渲染后无法使用javascript(使用ajax)

渲染部分 Rails3.x + coffeescript