基本上我想做的是拥有一个包含核心css和js的根application.haml,然后网站布局就像
所以我尝试通过向我的控制器添加一个sub_layout来实现这一点,所以例如我的家庭控制器是一个营销部分:
def sub_layout
"marketing"
end
用户使用的实际应用程序的控制器
def sub_layout
"userapplication"
end
def sub_layout
"siteadministrators"
end
然后在我调用的application.haml中 = render(:parital =>“layouts /#{controller.sub_layout}”)
这将返回“未定义的方法`格式”为nil:NilClass“
像这里的很多人一样,我对rails和haml很新,特别是虽然我有.NET MVC和Spark View引擎的经验
关于这个haml看起来像什么的想法?
答案 0 :(得分:15)
正如您所怀疑的那样,有一种标准的,更好的方法。 你的application.haml:
!!! XML
!!!
%html
%head
%title Title
= stylesheet_link_tag 'global'
= yield :styles
%body
#content
= yield
= yield :scripts
然后你的marketing.haml:
- content_for :styles do
= stylesheet_link_tag 'marketing'
- content_for :scripts do
= javascript_include_tag 'marketing'
%h1 It's Marketing time!
'content_for:styles'块中的任何内容都会在布局中相应的yield的上下文中执行。你不需要为每个产量都有一个content_for,如果你有多个,结果会被连接起来。
享受!
答案 1 :(得分:2)
试试这个:
= render :file => "layouts/#{controller.sub_layout}"
在控制器上调用方法是有问题的,因为它可能会将您的方法公开为操作。由于你只是返回一个字符串,你可以这样做(例如):
class HomesController < ApplicationController
@@sub_layout = "marketing"
cattr_reader :sub_layout
更好的选择可能是将其抽象为一个辅助方法,您可以使用控制器类查找值并返回布局文件名。这将使控制器更清洁。