Rails 可以指定某个控制器的 layout 的目录么?(解决)

chenge · 2013年03月19日 · 最后由 chenge 回复于 2016年07月04日 · 2828 次阅读

默认是在 layout 目录下,可以修改这个么?

假如你的目录是 layin, 简单解决方案是建立个软链接:

ln -s layin layout

ActionController 中有这个方法可以使用 prepend_view_path 方法。你可以在 application before_filter 中这样使用:prepend_view_path 'app/views2/'

#2 楼 @qichunren 代码如下,看能否改。我试验你说的,似乎不行。 class AdminController < ActionController::Base VERSION = 318 layout 'admin' end

#1 楼 @luikore 希望只针对某个控制器。

#3 楼 @chenge

ActionPack 里写死了要带 layouts 路径:

https://github.com/rails/rails/blob/master/actionpack/lib/abstract_controller/layouts.rb#L386

def _normalize_layout(value)
  value.is_a?(String) && value !~ /\blayouts/ ? "layouts/#{value}" : value
end

所以要绕开这个的话,在你那个 controller 里重写掉到这个方法:

def _normalize_layout(value)
  value
end

然后指定你自己的 layout 目录(假设你的 layout 目录在 app/views/my_layouts 目录下):

layout "my_layouts/application"

显然 AbstractController 里的这个方法是框架内部实现,这样改写是有风险也不被推荐的(你永远不知道什么时候这个实现机制会变掉)。但这个方法目前能实现你的要求。

#5 楼 @ashchan 谢谢高手,确实可以。 /\blayouts/ 这个是什么意思呢?

#6 楼 @chenge 这个是用正则去匹配是否有指定了 layouts 目录,没有则自定加上 layouts 目录

#7 楼 @uudui \b是什么呢?

#8 楼 @chenge \b Any word boundary,给你一个在线学习正则的链接多看看:http://rubular.com/

只是要改某个控制器的话,直接用 layout "../new_layout_folder/layout" 应该也是可以的

#11 楼 @hozaka 不行的,_normalize_layout 看你的路径中不带 "layout" 的话会硬给你加上一个。

#12 楼 @ashchan 对啊,加上之后是 "layouts/../new_layout_folder/layout" 我还特意建了个空项目测试了一下,Rails 3.2.13

就是代码可读性降低了,而且有点违背 Convention over Configuration 的原则

#13 楼 @hozaka 确实可以,更简单一些。我这个需求比较少见,一般不会改这个的。

#13 楼 @hozaka 确实可以:)我测试的时候把原 layouts 目录给删了,哈。

chenge Rails 学习汇集,请推荐内容 提及了此话题。 07月04日 11:35
需要 登录 后方可回复, 如果你还没有账号请 注册新账号