创建页眉和页脚的布局问题

 

       想要为Web应用程序上的每一页创建页眉和页脚。某页必须有特定的页眉页脚,想要动态决定对于给定请求该采用哪种页眉页脚。

解决方案

多数Web应用程序要求定义页眉页脚文件,并且自动包含这些文件到每一页的顶端和底部。Rails转化了这种模式。被调用的单一文件包含页眉和页脚,并且每个特殊页的内容被插入进这些文件中。

在Web应用程序中应用每一页的布局,创建名为app/views/layouts/application.rhtml的文件。类似如下:

<html>
 <head>
 <title>My Website</title>
 </head>
 <body>
 <%= @content_for_layout %>
 </body>
</html>

任何布局文件里的关键信息是指示<%= content_for_layout %>。这会被每个单独页面的内容所替代。

可以为每个控制器 创建自定义的布局,通过在app/views/layouts文件夹里独立创建文件来实现。比如,app/views/layouts /status.rhtml是status控制器、StatusController 的布局。PriceController的布局文件是price.rhtml。

重载site-wide layout 来自定义布局,它们并没有加上这个。

讨论

正如主视图模板一样,布局模板已经访问了所有操作设定的实例变量。任何可以在视图里做的事情,都可以在布局模板里完成。这意味着可以完成这样的事情,比如在操作中动态设定页面标题,然后在布局里使用它们:

class StatusController < ActionController:Base
 def index
 @title = "System Status"
 end
end

现在application.rhtml文件可以访问@title,类似如下:

<html>
 <head>

 <title>My Website - <%= @title %></title>
 </head>
 <body>

 <%= @content_for_layout %>
 </body>
</html>

application.rhtml 并不是仅仅针对Rails应用程序的控制器而发生在默认的布局模板里。它这样发生是因为每个控制器都是从ApplicationController继承 而来。默认来说,布局的名字是从控制器类名得到的。因此ApplicationController转变为application.rhtml。如果有一 个名为MyFunkyController的控制器,那么布局的默认文件名会是app/views/layouts/my_funky.rhtml。如果 这个文件并不存在,Rails 会查找对应于MyFunkyController父类的布局,并且会在app/views/ layouts/application.rhtml里找到。

要想改变一个控制器的布局文件,调用其布局方法:

class FooController < ActionController:Base
 # Force the layout for /foo to be app/views/layouts/bar.rhtml,
 # not app/view/layouts/foo.rhtml.
 layout 'bar'

end

如果在某次操作中使用render方法(参考15.5节),可 以传递:layout变量到render 里,并且给此次操作一个不同于其他控制器的布局。在本例中,FooController的大多数操作使用bar.rhtml作为它们的布局,但是 count操作使用的是count.rhtml:

class FooController < ActionController:Base
 layout 'bar'

 def count

 @data = [1,2,3]
 render :layout => 'count'
 end
end

甚至可以得到没有布局的操作。本段代码赋给FooController 的所有操作一个bar.html 的布局,除去count操作,它根本没有任何布局:它负责自己所有的HTML。

class FooController < ActionController:Base
 layout 'bar', :except => 'count'
end

如果需要动态计算布局文件,传递一个方法符号到布局方法中。这告诉布局在每次请求时都调用该方法。该方法的返回值定义了布局文件。方法可以调用action_name来决定当前请求的操作名字。

class FooController < ActionController:Base
 layout :figure_out_layout

 private

 def figure_out_layout
 if action_name =~ /pretty/

 'pretty'

# use pretty.rhtml for the layout

 else

 'standard'

# use standard.rhtml

 end

 end

end

最后,布局接受lambda 函数作为一个参数。这使得可以用更少的代码动态决定布局:

class FooController < ActionController:Base

 layout lambda { |controller| controller.logged_in? ? 'user' : 'guest' }
end

对于程序员和设计者来说,使用布局文件取代单独的页眉和页脚, 这都是很好的事情:更加容易查看这个图片。但是如果需要使用显式的页眉页脚,那么也可以。创建名为app/views/layouts /_header.rhtml和app/views/layouts/_footer.rhtml的文件。这里的下划线表明它们是“局部变量”(参考 15.14 节)。要使用它们,设置操作使之不使用任何布局,并且在视图文件里编写下述代码:

<%= render :partial => 'layouts/header' %>
... your view's content goes here ...
<%= render :partial => 'layouts/footer' %>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值