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 ""
===========================