Rails 在 layouts 中使用 partial 问题

alucardpj · 2013年04月15日 · 最后由 fenprace 回复于 2013年04月16日 · 3837 次阅读

在项目默认的 layout 文件 application.html.erb 中使用 partial, <% render "help" %> 已经在 layouts 文件夹中放了_help.html.erb 文件

然后调用页面 demo/index http://localhost:3000/demo/index

报错说:

Missing partial demo/help, application/help with {:locale=>[:zh], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
  * "/home/vagrant/vdata/rnes/app/views"
  * "/home/vagrant/.rvm/gems/ruby-2.0.0-p0/gems/twitter-bootstrap-rails-2.2.6/app/views"

问题解决倒不难,改成<% render "layouts/help" %>就可以了。 但是我想问一下如果仅指明 partial 文件名,在 layouts 中调用 partial 的路径调用顺序是怎样的?看报错信息似乎是从当前渲染页面的路径中找而不是在 layouts 文件夹中找,如果 miss 了似乎还会找到application/help里去(经过测试确实是找到 application/help 里去了)。这个文件夹有点诡异啊,为什么不是默认的 layouts 文件夹呢?

layout 不是应该只放 layout 才对么。

#1 楼 @zgm 我测过了,把 partial 文件放在 layouts 下面没反应,放在 application 文件夹下面才有用,我也很奇怪这个设定啊

#1 楼 @zgm partial 文件也是 layout 的一部分,标题栏底栏什么的

只有文件名的话,是找 action 对应的目录。

#4 楼 @Rei #3 楼 @alucardpj 应该是找 controller 对应的 view 目录下面的文件, 当然还有该 controller 继承的 controller 对应的 view 目录下面的文件, 所以你的例子中会有 demo/help, application/help 两个,这就是 rails 所说的 习惯 吧。

想找到源码给你看的,但是一时间忘了再哪。你可以自己找找看。

一个 partial 如果会被多个地方多重引用到(你的案例中 layout 用到一个 partial,然后 layout 被各个 controller/action 用到;更常见的是一个 partial 引用另一个 partial),一般就需要指定全路径。如果这个 partial 不属于特定的 controller,一般的惯例是放到 shared 目录下。

@alucardpj @zgm @ashchan @Rei @zj0713001 从 Rails 3.1 开始,支持模板的继承了,所以不写路径的时候,application 目录也会查找。 不属于特定 controller 的 partial,可以放到 application 目录下面。 具体可以参考这个 http://railscasts.com/episodes/269-template-inheritance

#8 楼 @blueplanet 模板继承其实就是 controler 的继承,要是 controller 没有继承 application,那你的方案就是不可用的了。 而且我不赞同所有东西都放在 application 里面,还是要根据 controller 的父类选择目录。

#10 楼 @zgm 确实喝 controller 的继承是一样的。 你所说的不继承 application 的 controller 是什么场景?方便简单说一下么?

不该是

render partial: 'layouts/help'

吗?

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