zoukankan      html  css  js  c++  java
  • 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 ""

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

  • 相关阅读:
    Python multiprocessing相关疑问
    Tornado demo3
    WebSockets
    Tornado Demo1---webspider分析
    Python assert断言
    Python学习之--数据基础
    Python学习之--python概要
    Python学习之--函数/生成器/装饰器
    Python学习之文件操作
    Python操作MySQL数据库
  • 原文地址:https://www.cnblogs.com/cly84920/p/4426899.html
Copyright © 2011-2022 走看看