rails学习笔记(3)

1)ruby可以将对象序列化,以字节流的等式保存,也许是内存,也许是数据库,然后在需要的时候再将它反序列化,还原成对象。rails就可以利用这一点,在session中保存对象,但需要注意的是,如果依赖rails来动态加载类,在尝试重新构造session数据的时候,rails可能还没有加载其中某个类的定义。因此,应该在控制器中用model声明来列举所有需要序列化的模型类。

2) 在渲染视图的时候,是通过在action中调用render方法实现的,如果不指定render方法,那么rails会依照惯例,调用和action命名相关联的视图。但其它在渲染视图的时候,视图是由两部分组成,一部分在app/views目录下,是这个action直接相关的视图,另一部分在app/views/layouts目录下,它是最终视图的布局页面。比如说几个页面有相同的页眉页脚,侧边栏,只是主体内容部分不同,我们可以在layouts目录下定义一个布局,在views目录下定义主体部分的内容,最终的视图就会让两者结合起来。

     声明布局有两个地方可以:

1)控制器的最前面,用layout声明,它会让整个控制器中所有action都使用指定布局,layout支持:only和:except修饰符来指定哪些action使用布局。

2)在action内部,给render方法传参:layout可以指定该action的layout。

============================================

class StoreController < ApplicationController

     layout "standard", :except => [:rss, :atom]                              #layout nil   可以禁用布局

     def rss

             render(:layout => false)               #不使用布局

     end

     def checkout

             render(:layout => "layouts/simple")

      end

     def test

          

      end

end

============================================

另外,layout除了可以接收字符串,也可以接收符号,使用符号的话,可以动态修改layout指向,如:

============================================

class TestController < ApplicationController

    layout :determine

    def determine

        if params[:id].nil?

                return "fancy_layout"

         else

                return "default"

         end

     end

end

============================================

如果不指定layout的话,rails默认会在layout目录下查找到控制器同名的rhtml或rxml文件作为布局,如果没有则会使用application.rhtml这个页面作为布局文件,它是针对所有action的全局性的布局。

3)在布局中可以和视图中一样,使用控制器中的实例变量,除此之外,布局中还可以通过controller得到控制器的实例,例如<%= controller.action_name %>可以得到当前控制器当前的action名。布局引用视图,可以通过@content_for_layout变量,也可以通过yield关键字,如:

========================

<%= yield %>

<%= @content_for_layout %>

========================

4) ruby语言处理异常真方便,可以先执行一条语句,如果语句有错误,直接在后面加个语句异常就行,挺方便的。

===========================

self.authors.map do |a|

      a.name

end.join(", ") rescue ""

===========================

posted on 2009-12-28 10:36  真阿当  阅读(73)  评论(0编辑  收藏  举报