- 博客(71)
- 收藏
- 关注
原创 行为驱动设计(rspec)
原文:Behavior Driven Design (并非公开版权文档) 你可能已经注意到,验证模对象改变了你在单元测试中执行的那类测试的本质。传统的单元测试中,通过断言(Assertion)来进行大多数的验证。这是一种对应用程序状态的测试。模对象的测试,是测试测试中调用过程十分符合预期。它测试的是应用程序的行为。至少潜在能力上,行为测试更容易将期望行为与实际的实现方法...
2008-11-12 00:26:13
323
原创 Rails Rake指南
Rake是怎么来的?很多年以前,当 Jim Weirich还在为一个Java项目工作时,他最初的选择也是Makefile,但是很快他意识到:要是能够在Makefile中嵌入Ruby代码,那会是多么的方便呀,于是,Rake就这么产生了。Rake支持任务创建,任务依赖关系追踪,以及文件编译时间识别。最后一个功能对Ruby程序员应该用不到,但如果你同时还是一个C程序员,那么你可以尝试使用...
2008-10-06 22:42:08
383
原创 常用的数据库字段类型
常用的数据库字段类型如下:字段类型 中文说明 限制条件 其它说明CHAR 固定长度字符串 最大长度2000 bytesVARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytesNVARCHAR2 根据字符集而定的可变长度字符串 最大长度4000 bytesDATE 日...
2008-08-11 14:40:44
786
原创 Linking to Other Pages and Resources
ActionView::Helpers::AssetTagHelper 和ActionView::Helpers::UrlHelper 模块包含很多方法,它们可让你引用外部资源到当前“模板”中。当然,更通常使用的是link_to(),它创建一个超链接给你的应用程序内的其它“动作”。 "add_comment" %>传递给link_to()的第一个参数是用于显示这个链接的文本。下...
2008-08-10 16:24:52
131
原创 Helpers
先前我们说过可以在“模板”中放置代码。现在我们要纠正这句话。在“模板”内放置少量代码还是可以让人接受的—这会让它们有更多动态性。但是,在“模板”内放置大量的代码就是糟糕的风格。这有两个主要原因。首先,在你的应用程序“视图”端放置大量的代码,很容易会让你降低要求并开始添加应用级别的功能给“模板”内的代码。这是个糟糕的风格;你希望放置应用程序代码在“控制器”和“模型”层中,以便在任...
2008-08-10 16:23:46
244
原创 rxml模板和rhtml模板
[color=red]Builder “模板”[/color]Builder 是个独立库,它可让你在代码中表达结构化文本(如XML)。一个Builder“模板”(在扩展名.rxml 文件内)包含使用了Builder 库的Ruby 代码来生成XML。这儿是个简单的Builder“模板”,它在XML 中输出一个有产品名字和价格的清单。xml.div(:class => "product...
2008-08-10 16:22:36
246
原创 “模板”
当你写一“视图”时,你就正在写一个“模板”:有时候这将生成最终结果。要理解这些“模板”是如何工作的,我们需要关心三件事:1、“模板”在哪儿。2、它们的运行环境,和3、它们内部是什么。“模板”在哪儿render()方法期望在由全局的template_root 配置选项定义的目录下找到“模板”。缺省,这被设置为当前应用程序的app/views 目录。在这个目录内,约定是给每...
2008-08-10 16:14:03
81
原创 Magic Column Names(自动的列名)
在课程的最后两章我们会提到很多列名字,它们对“活动记录”有重大意义。这儿是总结。1、created_at, created_on, updated_at, updated_on 用创建行的或最后更新行(_at形式)或(_on 形式)的时间戳来自动更新。2、lock_version Rails 将跟踪行版本号并完成乐观锁。如果表包含lock_version 的话。3、type 由...
2008-08-10 16:09:47
239
原创 Callback Objects
可在“模型”类内直接指定回调处理器,你可以创建分离的处理器类,它封装所有回调方法。这些处理器可以在多个“模型”间共享。一个处理器类是个简单的类,它定义回调方法(before_save(),after_create(),等等)。在app/models 目录内为这些处理器类创建源文件。在“模型”对象内使用处理器,你创建这个处理器类的实例,并传递那个实例给各种回调定义。几个例子会让这...
2008-08-10 16:04:08
130
原创 Timestamping Records
before_create 和before_update 回调有种潜在的用法是timestamping 行。class Order < ActiveRecord::Basedef before_createself.order_created ||= Time.nowenddef before_updateself.order_modified = Time.now...
2008-08-10 15:57:46
171
原创 Callbacks
“活动记录”控制“模型”对象的生命周期—它创建它们,监视它们的修改,保存,更新和删除。使用“回调”,“活动记录”让我们的代码参与这种监视过程。我们可以在一个对象的生命周期内让任何重大的事件来调用我们写的代码。在这些“回调”内,我们可以完成复杂的确认,映射列的值并将它们传递到数据库外部,甚至可阻止某些操作的完成。我们已经在“动作”内看到这个功能。当我们添加用户管理代码给我们的Depo...
2008-08-10 15:46:29
92
原创 “聚合”(Aggregation)
数据库列有个带限制的类型集: integers, strings, dates, 等等。典型地,我们的应用程序却有很多类型—我们用类定义来表现我们代码的抽象。更好的事是,如果我们能够映射数据库内的一些列信息到我们的高级抽象中—我们以同样方式包装行数据本身在“模型”对象中。例如,customer 表数据可能包括用于存储消费者姓名的列—或许是姓,名,称呼。在我们的程序内,我们想...
2008-08-07 00:20:16
515
原创 acts as list/acts as tree
[color=red]Acts As List[/color]在子表中使用acts_as_list,便能从父表的“视图”中得到像子表的行为。父表将能够遍历子表,在列表内移动子表,或从列表内移除子表。通过给每个子表一个位置数来实现列表。这意味着子表必须有个列来记录此位置。如果我们称它为列position,Rails 会自动使用它。如果不这么称呼它,我们需要告诉Rails 它的...
2008-08-07 00:03:03
197
原创 基于时间缓存
def index when_fragment_expired 'causes_list', 15.minutes.from_now do @causes = Cause.find_all_ordered endend如果能够容忍数据稍微有些陈旧,那么使用定时的到期机制将可以极大地简化缓存策略。对于每个被缓存的元素,只需指定想要缓存的内容、可生成动态内容的任何控制器...
2008-08-06 00:18:24
216
原创 Sweeper实例
expir_xxx 方法会工作的很好,但是在你的“控制器”中它们也要与缓存功能的代码合作。每次你修改数据库内的一些东西时,你也必须对它可能影响到的被缓存页做些工作。在应用程序较小时这很容易,但应用程序快速增长时这就会变得很困难。在一个“控制器”内的修改可能会影响到另一个“控制器”中被缓存的页。“帮助方法”内的商业逻辑,其实不应该知道有关HTML 页的信息,现在需要担心的是失效被缓存...
2008-08-03 22:16:40
238
原创 Caching(缓存)“缓存”什么
相关文献([url]http://www.ibm.com/developerworks/cn/web/wa-rails1/#N1007C[/url])许多应用程序似乎都花费很多时间做重复的事情。博客应用程序提交当前文章列表给每个访问者。商店应用程序在同一页显示产器信息给请求它的每个人。所有重复都浪费了我们服务器的资源时间。提交博客页面可以要求半打的数据库查询,它可以一直运行很多Ru...
2008-08-02 17:24:19
761
原创 verify(验证)
before“过滤器”的通常用法是在尝试一个“动作”之前确认是否遇到某些条件。Rails确认机制是一个抽取动作,它可帮助你比使用“过滤器”代码更简明地表述前置条件。例如,我们可能请求“会话”在我们的博客允许写评论前包含一个有效的用户。我们可以使用一个确认来表示这种思想,如class BlogController < ApplicationControllerverify :on...
2008-08-01 14:18:51
3008
原创 “过滤器”(before,after,around)
“过滤器”可以让你在你的“控制器”内写代码来包装由“动作”完成的处理—你可以写个代码块,并在你的控制器(或你的“控制器”的子类)内的任何数量的“动作”之前或之后来调用它。这是个强大功能。使用“过滤器”,我们可以实现检验计划,日志,responsecompression,甚至是定制的“应答”。Rails 支持三种类型的“过滤器”:before,after,和around。“过滤器...
2008-08-01 14:18:10
619
原创 Flash—“动作”间的通信
Flash—“动作”间的通信当我们使用redirect_to()来传输控制给其它“动作”时,浏览器生成一个单独的请求来要求那个“动作”。那个请求将通过我们应用程序的一个“控制器”对象的新实例内被处理—在原先“动作”内设置的实例变量在被重定向“动作”内的处理代码中将不再有效。但是有时候我们需要在这两个实例之间通信。我们可以使用叫flash 的功能做到这一点。flash 是个临时的...
2008-08-01 13:37:49
97
原创 “会话”存储比较和失效与清理
[color=red]比较“会话”存储选项[/color]对于这么多“会话”选项,我应该为应用程序选择哪一个呢?回答是“依赖”。如果排除过于单纯的内存存储,太多约束的文件存储,和过于复杂的memcached 的话,就剩下在PStore,ActiveRecordStore 和DRb 存储之间选择了。我们可以交叉比较这些选项的性能和功能。Scott Barron 对这些存储选项有着...
2008-07-31 22:58:51
222
原创 “会话”存储
在存储你的“会话”数据时,Rails 有很多选项。每个选项即好也不好。我们先列出选项的清单,然后再比较它们。“会话”存储机制使用DEFAULT_SESSION_OPTIONS 哈希表的:database_manager 参数设置。其它的选择是:1、:database_manager => CGI::Session::Pstore 这是Rails 使用的缺省“会话”存储机制。每个...
2008-07-31 22:56:59
199
原创 “会话”session
Rails 的“会话”是个类似哈希表的结构,它在请求期间会一直有效。不像原始的cookie,“会话”可以持有任何对象(只要这些对象可以被marshale),来保存web 应用程序内的状态信息。例如,在我们的store 应用程序中,我们使用了一个“会话”在请求之间持有购物车对象。此购物车对象在我们的应用程序中使用起来应该像其它对象一样。但是Rails 安排在每个请求处理的尾部保存购物车,更重要的...
2008-07-31 22:54:12
143
原创 cookies
Cookie 允许web 应用程序从浏览器“会话”中得到类似哈希表的功能:你可以在客户端浏览器上存储名字字符串,并在随后的请求中可按名字取回相应的值。这太有意义了,因为HTTP,在浏览器和web 服务端之间使用的协议,是无状态的。Cookie提供了用于克服这一限制的手段,以允许web 应用程序在两次请求间保留数据。Rails 在背后为cookie 抽象出了一个方便的,简单的接口。“...
2008-07-31 22:40:24
213
原创 Ruby 异常处理
异常处理是开发过程中经常要面对的问题,基本所有高级语言都有自己的异常处理系统,ruby也不例外,而且使用起来也非常简单。 ruby中异常的抛出是使用的raise方法,记住哦,这是个方法,由ruby Kernel提供的,而不是关键字,同时ruby也为这个方法提供了一个别名fail,可以用fail代替raise,抛出异常的例子如下: Ruby代码 raise ...
2008-07-30 00:47:04
455
原创 rails2.0被废弃的用法
在Rails2.0当中有大量的用法已经被废弃掉了,在你的应用程序升级到Rails2.0的过程当中必须注意。下面我先列举一下有哪些用法被废弃,然后有什么替代方案,大家请帮我补充: 一、controller的paginate分页方法被拿掉了2.0以前controller带有paginate这个public的分页方法,现在已经不能使用了。现在推荐的是另外一个替代插件will_pagina...
2008-07-30 00:45:07
125
原创 对用户应答(1,2,3)
“控制器”的一部分工作是响应用户。有三个基本方式来完成个工作:1、最通用的方式是提交一个模板。在MVC 图中,模板是“视图”,它从“控制器”获得信息并使用“控制器”来生成一个对浏览器的应答。2、“控制器”可以直接返回一个字符串给浏览器而不是调用一个“视图”。这很少使用,但可用于发送一个错误信息。3、“控制器”可以发送其它数据给客户端(有时候不是HTML)。这典型地用...
2008-07-30 00:36:49
87
原创 应答3-重定向(redirect_to)
一个HTTP redirect 被从服务端发送给客户端,以应答一个请求。它会说,“我不能处理这个请求,但这儿有些人能处理”。Redirect 应答包括一个URL,它是客户端应该试着下次发送同样的状态信息给这个redirect,而不管它是持久的(状态码301)还是临时的(状态码307)。有时,当web 页面被重新改编时,redirect 会被使用;访问旧位置页面的客户端将被引到页面的...
2008-07-30 00:34:45
2208
原创 应答2-发送文件和其它数据(send_data)
我们已经看了在“控制器”内提交模板(render)和发送字符串(render_to_string)。应答的第三个部分是发送数据(典型地,但不是必须的,是文件的内容)给客户端。A、send_data 发送包含二进制数据的字符串给客户端。send_data(data, options...)发送一个数据流给客户端。典型地浏览器将结合使用内容类型与部署,两者在选项内设置,来决定这个用...
2008-07-30 00:25:32
1229
原创 应答1-提交模板(render)方法
模板是个文件,它定义一个应答的内容。Rails 支持两种格式的模板:rhtm,它是包含有Ruby 代码和构建器的HTML,更多地用于程序方式。习惯上,app/views/control/action.rhtml 或者app/vies/controller/action.rxml 文件内的模板用于“控制器”控制“动作”。app/views 缺省是名字的部分。它可以被覆写,通过设置Acti...
2008-07-29 23:52:12
201
原创 开发环境中的预设对象(request、params)
“控制器”为“动作”设置环境。环境被建立在实例变量内,但你应该在“控制器”内使用相应的存取器方法。[color=red]/request/[/color]request对象对应于用户的各种请求,request对象详细地记录了每个特定的物理信息,它允许开发人员通过一定的方法来提取这些信息。request 对象的有用属性包括:1、domain(),它返回request 的最后两个d...
2008-07-29 23:33:26
269
原创 action 方法-hide_action
当“控制器”对象处理请求时,它查找与引入“动作”同名的public 实例方法。如果找到了,那个方法就会被调用。如果没找到,但“控制器”实现了method_missing()方法,则此方法会被调用,并传递“动作”的名字做为它的第一个参数,然后用一个空的参数列表做第二个参数。如果没有方法被调用,“控制器”会查找与当前“控制器”和“动作”同名的“模板”。如果找到,这个“模板”会被直接提交...
2008-07-29 23:00:01
177
原创 有名路由
到现在我们已经在routes.rb 文件中使用map.connect 创建了匿名的“路由器”。通常这就足够了;Rails 会做好由我们传递给url_for()等的给定参数创建的URL 的挑选工作。当然,我们可以给出“路由器”的名字,以让我们应用程序更容易理解。这不会修改引入URL的解析,但它会让我们在代码中能明确指定生成URL 的“路由器”。你在“路由器”定义内使用一个名字而不是c...
2008-07-29 16:13:33
89
原创 还原URL-url_for()
生成URL“路由器”接受一个URL,并解码它到参数集中,这些参数再由Rails 分派给适当的“控制器”和“动作”(也按此方式潜在地设置额外的参数)。但是这只是故事的一半。我们的应用程序也需要创建能引用其自身的URL。例如,每次显示一个表单时,表单需要被连接回一个“控制器”和“动作”。但应用程序的代码不必知道URL 格式的编码信息;它们被看成是被调的参数,“路由器”用这些参数完成...
2008-07-29 15:39:06
495
原创 路由请求(定制URL-map.connect)
到现在为上,本书中我们已经不在烦恼,Rails 是如何映射一个请求如store/add_to_cart/123 给一个特定的“控制器”和“动作”了。现在我们向深处看看。rails 命令为一个应用程序生成最初的文件集。这些文件中的一个是config/routes.rb。它为应用程序包含了“路由器”信息。如果你查看此文件的缺省内容,忽略注释的话,你会看到下面这样。ActionC...
2008-07-29 15:06:44
457
原创 处理流程
在了解controller控制器的处理流程之前,首先需要了解ROR是如何从整体上对用户请求进行处理的,以URL地址http://127.0.0.1:3000/item/list为例,当用户访问这个地址时,ROR按顺序自动完成4个过程,1、搜索app/controllers目录,查看是否存在item_controller.rb文件2、若有则进行加载,并实例化ItemController类...
2008-07-29 14:25:08
181
原创 事务处理
数据库事务将一系列修改组合在一起,以一种方式要么完成所有修改,要么一个都不修改。经典使用事实的例子是两个银行账户间的现金交易。基本逻辑很简单。account1.deposit(100)account2.withdraw(100)在Active Record 中,我们使用transaction()方法来执行一个块,这是一个特殊的数据库事务处理的上下关联的段落。这个块的结尾,事务处...
2008-07-29 13:53:53
96
原创 计数器
has_many 关系定义了一个属性,它是一个集合。它似乎能够回答有关集合大小的问题:这个定单有多少个商品项目呢?实际上你会发现,聚合有个size()方法,它返回的就是这个关联的对象数目。这个方法是深入到数据库在子表中执行select count(*)语句,计算外键引用父表的相关记录数。这个看起来是可行的。然而,如果你需要频繁的知道子项目的个数,这个额外的SQL 就可能会是一个...
2008-07-29 13:51:56
90
原创 自连接
对于表中的一个记录连接同一个表中的另一个记录也是可能发生的。举个例子,公司里每一个雇员有一个manager 和一个mentor,这两个也是雇员。在Rails 你可以这样建模。class Employee < ActiveRecord::Basebelongs_to :manager,:class_name => "Employee",:foreign_key => "manag...
2008-07-29 13:51:08
96
原创 多对多关系
多对多的关系是对称的关系,两个连接的表都互相使用has_and_belongs_to_many来声明它们之间的关系。在数据库中,多对多关联是使用中间连接表来实现的。它包含一对外键连接两个目标表。Active Record假定这个连接表的名字是两个目标表名以字母顺序串联起来。在前面例子中,我们连接表categories和表products, Active Record会去找一个名...
2008-07-27 15:38:32
297
原创 一对多关系
一对多关系允许你描述一个对象集合。例如,一个定单可能有多个关联的商品项目。在数据库中,对于一特定定单的所有商品项目行包含一个外键列来引用这个定单。在Active Record中,父对象(逻辑上是包含子对象的一个集合)使用has_many来声明对子表的关系,子表用belongs_to来表明它的父类。在我们的例子中,类LineItem belongs_to:order和orders表h...
2008-07-27 15:27:19
155
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人