`
jbf034
  • 浏览: 152332 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
文章列表
“控制器”为“动作”设置环境。环境被建立在实例变量内,但你应该在“控制器”内 使用相应的存取器方法。 /request/ request对象对应于用户的各种请求,request对象详细地记录了每个特定的物理信息,它允许开发人员通过一定的方法来提取这些信息。 request 对象的有用属性包括: 1、domain(),它返回request 的最后两个domain 的组成部分。 2、remote_ip(),它在一个字符串中返回远程IP 地址。如果客户端有代理的话,此字符 串可以有多于一个的地址。 3、env(),request 的环境。你可以使用这个来访问由浏览器设置的值,如 request.env ...
当“控制器”对象处理请求时,它查找与引入“动作”同名的public 实例方法。如果找 到了,那个方法就会被调用。如果没找到,但“控制器”实现了method_missing()方法,则 此方法会被调用,并传递“动作”的名字做为它的第一个参数,然后用一个空的参数列表做 第二个参数。如果没有方法被调用,“控制器”会查找与当前“控制器”和“动作”同名的 “模板”。如果找到,这个“模板”会被直接提交。如果这些都不行,则生成一个UnKonow Action 错误。 缺省地,“控制器”内的任何public 方法都可以被做为一个“动作”的方法调用。你可 以将现有的“动作”,通过标记它们为protected 或p ...
到现在我们已经在routes.rb 文件中使用map.connect 创建了匿名的“路由器”。通常 这就足够了;Rails 会做好由我们传递给url_for()等的给定参数创建的URL 的挑选工作。当 然,我们可以给出“路由器”的名字,以让我们应用程序更容易理解。这不会修改引入URL 的解析,但它会让我们在代码中能明确指定生成URL 的“路由器”。 你在“路由器”定义内使用一个名字而不是connect 来简单地创建一个有名字的“路由 器”。你使用的名字会变成那个特定“路由器”的名字。例如,我们可以像下面那样重新编 码我们的博客的“路由器”。 ActionController::Routing:: ...
生成URL “路由器”接受一个URL,并解码它到参数集中,这些参数再由Rails 分派给适当的“控 制器”和“动作”(也按此方式潜在地设置额外的参数)。但是这只是故事的一半。我们的应 用程序也需要创建能引用其自身的URL。例如,每次显示一个表单时,表单需要被连接回一 个“控制器”和“动作”。但应用程序的代码不必知道URL 格式的编码信息;它们被看成是 被调的参数,“路由器”用这些参数完成工作。 我们可以硬编码所有的URL 到应用程序中,但稍微懂些请求格式的人都会伤害到我们的 程序。这违反了DRY 原则;当修改应用程序的位置或URL 格式时,我们必须修改所有这些字 符串。 幸运地是我们不用担心,R ...
到现在为上,本书中我们已经不在烦恼,Rails 是如何映射一个请求如 store/add_to_cart/123 给一个特定的“控制器”和“动作”了。现在我们向深处看看。 rails 命令为一个应用程序生成最初的文件集。这些文件中的一个是config/routes.rb ...
在了解controller控制器的处理流程之前,首先需要了解ROR是如何从整体上对用户请求进行处理的,以URL地址http://127.0.0.1:3000/item/list为例,当用户访问这个地址时,ROR按顺序自动完成4个过程, 1、搜索app/controllers目录,查看是否存在item_controller.rb文件 2、若有则进行加载,并实例化ItemController类,生成一个对象; 3、在app/helper目录下查找是否存在item_helper.rb文件若存在文件则加载; 4、查看app/models目录下是否存在item.rb文件,若存在则加载 contro ...
数据库事务将一系列修改组合在一起,以一种方式要么完成所有修改,要么一个都不修 改。经典使用事实的例子是两个银行账户间的现金交易。基本逻辑很简单。 account1.deposit(100) account2.withdraw(100) 在Active Record 中,我们使用transaction()方法来执行一个块,这是一个特殊的数 据库事务处理的上下关联的段落。这个块的结尾,事务处理被提交,更新数据库,除非块中 有异常抛出,一旦出现异常,所有的改变将被回滚,数据库的状态还是没有改变。因为事务 处理位于数据库连接的上下文环境中。我们必须用一个Active Record 类做为一个被调来来 调 ...
has_many 关系定义了一个属性,它是一个集合。它似乎能够回答有关集合大小的问题: 这个定单有多少个商品项目呢?实际上你会发现,聚合有个size()方法,它返回的就是这个 关联的对象数目。这个方法是深入到数据库在子表中 ...
对于表中的一个记录连接同一个表中的另一个记录也是可能发生的。举个例子,公司里 每一个雇员有一个manager 和一个mentor,这两个也是雇员。在Rails 你可以这样建模。 class Employee < ActiveRecord::Base belongs_to :manager, :class_name => "Employee", :foreign_key => "manager_id" belongs_to :mentor, :class_name => "Employee", :foreign_k ...
多对多的关系是对称的关系,两个连接的表都互相使用has_and_belongs_to_many来声 明它们之间的关系。 在数据库中,多对多关联是使用中间连接表来实现的。它包含一对外键连接两个目标表。 Active Record假定这个连接表的名字是两个目标表名以字母顺序串联起来。在前面例子中, 我们连接表categories和表products,   Active Record会去找一个名为categories_products的连接表。 注意:我们的连接表没有id这个列。这其中有两个原因,第一,它不需要-记录行已经 有两个定义好了的唯一外键。我们在DDL是这样定义表。 create tabl ...
一对多关系允许你描述一个对象集合。例如,一个定单可能有多个关联的商品项目。在 数据库中,对于一特定定单的所有商品项目行包含一个外键列来引用这个定单。 在Active Record中,父对象(逻辑上是包含子对象的一个集合)使用has_many来声明对 子表的关系,子表用belongs_to来表明它的父类。在我们的例子中, 类LineItem belongs_to:order和orders表has_many :line_items。 我们已经在前面说了belongs_to()关系声明。它和在一对一关系的处理上是一样的。只 是has_many声明添加了一些功能给它的model。 has_many() ...
一对一关系(或者更正确的是,一对零或一关系)由一个表内的行中的一个外键实现,它 至少引用了另一个表的单个行。上面图显示了order和invoice之间的一对一关系:一个order可以没有invoice引用它或者只有一个invoice引用它。 在Active Record内,我们通过添加声明has_one :invoice给类Order来表示这种关系 ,同时,添加belongs_torder给类Invoice。(记住belongs_to行必须出现在用于包含外键的表的model内。)你可以从关联的任一端用一个order来关联一个invoice。 你可以告诉一个order,它有一个invoice与它关 ...
大多数应用程序都是使用数据库的多个表的,而且一些表之间还存在着一些关联。定单 Orders有多个商品项目。一个商品项目将引用一个特殊的产品。一个产品可能属于许多不同 的产品分类目录,而每个分类目录有许多不同的产 ...

CRUD-delete

Active Record 支持两种形式的记录删除。 (delete) 首先,它有两个类级别方法delete()和 delete_all(),都是在数据库级别上来操作。 delete()方法接受一个id 或一个id 数组,来删除表中相应的记录。 delete_all()删除匹配给定条件的记录行(如果没有条件就删除全部的记录)。这两个调用的返回值依赖于适配器,一般情况典型地是受影响的记录行数。如果调用之前记录不存在,也不抛出异常。 Order.delete(123) User.delete([2,3,4,5]) Product.delete_all(["price > ?" ...
我们已经讨论了很多finder 相关的方法,Active Record 关于更新记录的操作并不多。 如果你有一个Active Record 对象(或许表示为我们的orders 表的一行),你可以通过save()方法把它写入数据库,如果这个对象以前是从数据库中读出,这个存盘的操作将更新现有记录。否则save()将会插入一个新行。 如果一个现有记录行被更新,Active Record 将使用它的主键列匹配内存中的对象。包 含在Active Record 对象中的属性决定了被更新的列。即使列值没有改变,这个列也要在数据库中去更新。例如,在下面例子中,对于数据库表中定单为123 的行的所有值将被更新 o ...
Global site tag (gtag.js) - Google Analytics