新手问题 如何在 application.html.erb 中设置只在首页才 render 某 Partial

LinuxGit · 2014年10月01日 · 最后由 leekelby 回复于 2014年10月02日 · 2977 次阅读

由于在 application.html.erb 中设置 view yield 到 bootstrap container 中,固定宽度,页面两边留白。

<body>
  <%= render 'layouts/header' %>
  <%= render 'layouts/home_header' %>
  <div class="container">
    <% flash.each do |key, value| %>
      <%= content_tag(:div, value, class: "alert alert-#{key}" ) %>
    <% end %>
    <%= yield %>
    <%= render 'layouts/footer' %>
    <%= debug(params) if Rails.env.development? %>
</body>

我新建了_home_header.html.erb partial,width: 100% 如图中的彩色背景,两边不需要留白。 希望只在首页或在 StaticPagesController 指定 action 下才 render,该怎么处理呢?求助,谢谢。

换个 layout,在 controller 对应 action 里面指定 layout

你可以在 layout 里面新建一个跟你 controller 名字一样的模板,我也是最近发现的

每次 request 请求 params 里会带有 controlleraction 的信息。

<% if params['controller'] == 'staticpages' && params['action'] == '指定 action' %> 
  <%= render 'layouts/home_header' %>
<% end %>

你这样试试

#2 楼 @jicheng1014 #1 楼 @aptx4869 使用新的 controller 模板会多增加一份重复代码,一个 layout 级别的模板需要更改时,既需要更改 application.html.erb 还需要需要 controller.html.erb 。 如果楼主只有一个地方不同,那么不建议写新的 controller 模板,使用 if 判断是比较好的选择,可以减少代码重复。

#4 楼 @tiseheaini 可以对 layout 进行一次抽取,将相同的部分放到另一个文件里面,就可以解决这个问题了

#3 楼 @tiseheaini 太谢谢了,立马见效,我自己折腾老半天。

#2 楼 @jicheng1014 @aptx4869 @chunlea 谢谢大家热心回复,才知道可以针对 controller 指定 layout. rails guide 才读到 model,继读研究学习。

在 application.html.erb 里面

<%= render 'layouts/header' %>
<%= yield :home_header %>
<div class="container">
 ....

在你的 home.html.erb 里面

<% content_for :home_header do %>
  <%= render "layouts/home_header" %>
<% end %>

#4 楼 @tiseheaini 按照产品和设计的一贯尿性,能做出一处不同以后就会做出 N 处不同,最后还是会分开为不同模板的,不然一堆 if else 太难看了……分开以后重复代码问题,可以重用部分合成 partial 就是了

#9 楼 @aptx4869 我也不是很清楚楼主的需求,如果只有一处有这样的需求那么就用 if else,如果有多处,使用独立模板会更好。

#3 楼 @tiseheaini 都走到这一步了,可以再往下走一点,Rails 有 current_page? 可以用:

条件复杂可以再抽取出来成 helper
<% if current_page?(条件 ...) %> 
  <%= render 'layouts/home_header' %>
<% end %>

根据复杂度不同,楼主还有不同处理方式,可以参考以上几位建议...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号