技术开发 频道

Ruby on Rails为何走红企业领域?

   Rails的工作原理

   Rails可以被分解成两个核心库:ActiveRecord和ActionPack。ActiveRecord是一个类似Hibernate的对象关系映射(object/relational mapping,ORM)库。ActionPack封装了核心控制器(ActionController)以及一个视图级别的模板引擎(ActionView/ERb)。一个标准的Rails安装包含了几个工具可以自动完成很广范围内的普通任务。

   在Java框架和Ruby on Rails之间存在一个比较重大的差异,这一点可从Rails的“惯例优先配置”的思想中看到。每一个Java开发人员不得不忍受折磨来维护他们项目中永远少不了的XML文件。Rails通过为文件、数据库表、列名称和目录结构设定基本的约定,基本解决了这个问题。这种转变的目的是让开发者更专注于真实的问题。

   另一个文化差别可以通过另一个在Rails社区经常提到的思想来体现——不要重复自己的代码。类似的Java实现非常难于被改变。Java和.NET解决方案通过创建工具进行“重构”或重命名一个全局引用的定义来解决这个问题。而在Rails中进行修改变得非常简单,通常需要在一个位置进行修改即可。

   1、模式

   Ruby on Rails的模型层是通过ActiveRecord来提供的。ActiveRecord是一个对象关系映射(ORM)库,这一点与Hibernate和TopLink相似。ActiveRecord对象表现来自一个数据库表的单个记录。定义一个AR类是非常简单的,并且大多数配置被隐藏在默认约定之后:

class Page < ActiveRecord::Base end

   将其与一个效果相同的Hibernate定义进行对比:

/** * @hibernate.class table="miners" */ public class Miner { private Long id; ... more column vars ... /** * @hibernate.id generator-class="native" */ public Long getId() { return id; } public void setId(Long id) { this.id = id; } ... more column getters and setters ... }

   你将注意的第一个区别是,在ActiveRecord的实现中没有结构或列名称的提及。这个代码段将参考页面表,并且自动生成Getter和Setter。这个类的一个实例的属性从数据库中得到,例如它们的类型。这些默认的约定多数可以在需要的时候可以被忽略,但是这个命名约定提供给Rails足够多的信息让你解放出来,让你解决手头上真实的问题。唯一需要进行配置的是建立最初的数据库连接;即database.yml:

development: adapter: mysql database: application_development username: application password: password host: localhost

   ActiveRecord的联合可以通过下面的代码来指定:

class User < ActiveRecord::Base has_many :articles end class Article < ActiveRecord::Base belongs_to :user end

   上面在Article类中的blongs_to语法告诉ActiveRecord,将来自user_id数据库的一个列关联到user上。它与上面的has_many和has_one宏具有相反的意思。通过这个知识,ActiveRecord可以实现某些有意思的功能,让其本身可以编写出非常具有可读性的代码。

article = Article.find(45) user = article.user users_articles = user.articles

   2、控制器

   控制器层被用来控制网站的流程。它是ActiveRecord和ActionView之间的数据中介。ActionController提供功能设施,处理和组织来自数据库和Web表单输入的数据,然后它将这些数据递交给ActionView,ActionView将这些数据插入模板并显示,在早期的Rails版本中把控制器看做创建URL路径的一种方法。在现在的社区中,每一个控制器代表着某一类抽象或具体的“资源”。这些资源通常有四个基本的操作:Create(创建)、Read(读取)、Update(更新)和Delete(删除) (CRUD)。大多数控制器具有七个核心的操作(index、show、new、create、edit、update和destroy)。

   举个例子来说,一个事件搜索页面必须查询一个事件列表,并把它往上传递给视图,而且,这个事件列表将通过某些要求的参数实现参数化。

class EventsController < ApplicationController def index @events = Event.fulltext_find(params[:search_term]) end # ... other actions end

   这儿Rails中有一些语法甜头(syntactic sugar),可以用来过滤客户端请求和以不同的方式来处理它们。这些语法有before_filter、after_filter和around_filter等。最常用的过滤器是before_filter:

class EventsController < ApplicationController before_filter :login_required, :except => [:index] # ... other actions end

   3、视图

   标准的Rails模板引擎被称为ERb。ERb看上去非常像PHP:

<% form_for todo do |f| %> <table> <tr><td><%= f.date_select :due_at %></td></tr> ... </table> <% end %>

   上面提到的CRUD体系在Rails框架的视图层上也同样存在。上面的form_for使用了通过todo ActiveRecord对象传递的信息,同时加以某些基本的约定,来为这个表单创建提交方法和URL。依附于这个表单的对象具有关于todo对性的信息。这种模式将自动的填充默认值,并且能够被定制和扩展以表现更复杂的格式。通过这些助手的帮助,Rails正在实现众多的设想,不过最终的结果是一个易懂、易维护的非常具有可读性的代码。

0
相关文章