• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >ruby > Ruby on Rails中MVC结构的数据传递解析

Ruby on Rails中MVC结构的数据传递解析

作者:goldensun 字体:[增加 减小] 来源:互联网

goldensun 通过本文主要向大家介绍了ruby on rails,ruby on rails教程,ruby on rails安装,ruby on rails下载,ruby on rails指南等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

如果读者已经开发过基于 Rails 的应用,但对其 MVC 间的数据传递还有诸多困惑,那么恭喜您,本文正是要总结梳理 Rails 数据传递的方法和技巧。Ruby on Rails 3(以下统称为 Rails 3)是当前的主要发布版本,本文所述及的内容和代码都基于此版本。
Rails 3 简介

Ruby on Rails 是一个 Ruby 实现、采用 MVC 模式的开源 Web 应用开发框架,能够提供 Web 应用的全套解决方案。它的“习惯约定优于配置”的设计哲理,使得 Web 开发人员能够从繁琐的配置中解放出来,专注于核心的应用逻辑。“习惯约定优于配置”是 Rails 根据最佳经验习惯,提供可直接使用的功能及规范,而不再需要开发人员通过复杂的配置文件进行具体繁琐的设置。Ruby on Rails 快速高质的开发特性及其数量众多的免费插件,吸引了包括 Twitter、Groupon 和 Hulu 等大批互联网新贵。

快速创建 Rails 3 应用程序

为了逐步演示 Rails 3 的功能特性,此处采用增量模式开发一个简单的博客模型。 在安装完 Rails3 之后,运行命令:Rails new demoBlog 。

demoBlog 应用程序所需的各类文件就自动生成。进入生成的文件夹 demoblog,运行自动安装 demoBlog 所需 gem 的命令:bundle install 。

然后在 $rorails/demoblog/config/database.yml 中简单地配置数据库文件,运行创建数据库的命令:rake db:create 。

至此,简单的 demoBlog 创建完毕,运行服务器启动命令:rails server 。

打开 http://localhost:3000 就可以看到 Rails 3 的典型欢迎页面,如图 1 所示。
图 1. Rails 3 的典型欢迎页面

2015422173048964.jpg (554×406)

Rails 脚手架可以快速地为新资源建立起模型、视图和控制器,而不必处理其中的细节。直接运行以下命令,为 demoBlog 建立一个 article 脚手架,用于管理博客里的文章。运行脚手架建立命令:rails generate scaffold Article title:string keywords:string content:text

这将生成 article 控制器、 article 的视图文件和含有 title、 keyword 及 content 三个属性的 article 模型。运行数据库迁移命令,生成相关数据表:rake db:migrate 。 此时,一个简单但结构完整的文章管理系统就开发完成。 通过 URL:http://localhost:3000/articles/就可以直接访问其文章管理页面。

Rails 3 MVC 架构解析

Rails 3 采用 MVC(Model 模型、View 视图、Controller 控制器)层级架构实现核心功能模块。这不仅使业务逻辑独立于用户界面,代码清晰易于维护,还能够提高代码重复利用率,达成 Rails“不重复自己”的原则。Rails 中 MVC 的功能分别如下:

  •     Model(模型):代表应用系统的数据信息以及操作这些数据的规则;
  •     View(视图):代表应用系统的用户接口,通常是包含嵌入式 Ruby 代码的 HTML 文件,用于向浏览器提供数据的工作;
  •     Controller(控制器):主要负责处理 Web 请求,检索模型数据并按要求将数据传递给视图。控制器是模型和视图的联系桥梁。

以上文创建的 demoBlog 应用程序为例,用户为访问文章列表,输入页面的 URL:http://localhost:3000/article 打开页面,对应的 Web 请求处理流程如图 2 所示,大致步骤如下:

  •     浏览器发出 Web 请求
  •     路由模块将请求信息发送给相应的控制器,由控制器决定如何处理请求;
  •     控制器根据请求处理逻辑,调用相应的模型来完成业务逻辑;
  •     根据实际需求,完成数据的检索或存储;
  •     控制器组织处理信息,调用视图解析从模型返回的数据;
  •     完成页面渲染,返还数据给浏览器。

图 2. Rails 3 MVC 事件处理流程图

2015422173114724.jpg (492×427)

通过 Rails 3 典型的内部处理流程,可以看到 Rails 3 的 MVC 结构清晰,分工明确。那么这些功能紧密联系的模块,是如何完成数据传递,又有哪些技巧呢?许多初学者都为此困惑不已,笔者将在下文的进行详细地分析介绍。

控制器与视图间的数据传递方法技巧

打开视图文件夹,找到用于实现文章列表的源文件 $rorails/demoBlog/app/views/articles/index.html.erb,可以看到清单 1 所示代码。这段代码对变量 @articles 迭代,显示所有文章列表的属性值。
清单 1. 视图 index.html.erb 代码片段

 <% @articles.each do |article| %> 
 <tr> 
  <td><%= article.title %></td> 
  <td><%= article.keywords %></td> 
  <td><%= article.content %></td> 
  <td><%= link_to 'Show', article %></td> 
  <td><%= link_to 'Edit', edit_article_path(article) %></td> 
  <td><%= link_to 'Destroy', article, :confirm => 
  'Are you sure?', :method => :delete %></td> 
 </tr> 
 <% end %>

</div>

让初学者困惑不已的是,此处的变量 @articles 来自何处呢?为了解决这个问题,打开 article 控制器的源文件 $rorails/demoblog/app/controllers/articles_controller.rb,找到与 index.html.erb 对应的 index 方法,可以看到变量 @articles,如清单 2 所示。视图中的 @articles 变量正是由控制器生成赋值,然后传递给视图的,并且这个传递过程对开发人员而言是透明的。换句话说,视图可以直接使用对应控制器中对应方法的变量。
清单 2. 控制器中获取数据的代码片段

 def index 
  @articles = Article.all 
  respond_to do |format| 
   format.html # index.html.erb 
   format.xml { render :xml => @articles } 
  end 
 end

</div>

用户打开 http://localhost:3000/articles/new 发表新文章,控制器将通过 @article = Article.new,基于 Article 模型创建一个值为空的数据,然后传输给 new.html.erb 视图,显示效果如图 3 所示。用户在这个空的页面上填写数据,点击“Create Article”创建文章。文章创建成功,返回文章创建成功的提示信息和新创建文章的内容,如图 4 所示。这里看似一个简单的过程,实际上包含了将数据从表单传递到控制器,进而传递到模型完成存储的过程。
图 3. 新创建文章

2015422173146023.jpg (458×454)

图 4. 文章创建成功

2015422173212461.jpg (500×271)

渲染视图的代码位于 _form.html.erb(被 new.html.erb 调用)。用户点击提交后,Rails 将根据路由规则跳转到控制器的 create 方法。过程的确简单,但是用户填写到表单的数据是如何传递给控制器的呢?

控制器的 create 方法如下清单 3 所示。为了创建新的 article 对象,create 方法将从 params 中读取数据 :article 参数。这里的 params 是哈希表,它是 Rails 里最重要的传递参数之一,包含浏览器请求传递的数据。正是这个 params 将数据从客户端表单传递到控制器。以此处为例,新建的文章表单数据(包括 Title,Keywords,Content)将被封装到 article 对象,通过 params 传递到控制器。
清单 3. 控制器的 create 方法

 def create 
  @article = Article.new(params[:article]) 
  respond_to do |format| 
   if @article.save 
    format.html { 
   redirect_to(@article, :notice => 'Article was successfully created.') }
    format.xml { 
   render :xml => @article, :status => :created, :location => @article } 
   else 
    format.html { 
   render :action => "new" } 
    format.xml { 
   render :xml => @article.errors, :status => :unprocessable_entity } 
   end 
  end 
 end

</div>

Rails 应用程序可以用两种方法的把数据传给 params,进而由控制器的某个方法获取。一种是将用户输入到 HTML 表单的数据封装到 HTTP 请求,通过 POST 方法将数据传给控制器的 params。上文采用的就是这种方法,将 new.html.erb 视图的表单数据通过 POST 方法提交。另外一种方法就是通过把数据作为 URL 的一部分,位于 URL 中 ? 之后,通常称为 URL 查询字符串参数。Rails 并没有对这两种方法传递的数据做出区分,控制器都能够以前文述及的方法从 params 中获取数据。以 URL:http://127.0.0.1:3000/articles?keywords%5b%5d=Hello&keywords%5b%5d=Test& keywords%5b%5d=Article 为例,params[:keywords] 将存储 [“Hello”, “Test”, “Article”]。

控制器与模型间的数据传递方法技巧

正如图 2 所示,控制器是连接视图与模型的关键组件,它不仅接收来自视图的表单数据,还可以将模型里的数据传递给视图。比起控制器与视图之间的数据传递,控

您可能想查找下面的文章:

  • Rails bundle命令安装mysql gem包出错的解决方法
  • win7安装ruby on rails开发环境
  • 简单对比分析Ruby on Rails 和 Laravel
  • 在 Ubuntu 12.04 Server 上安装部署 Ruby on Rails 应用
  • 快速正确的安装 Ruby, Rails 运行环境
  • Windows下Ruby on Rails开发环境安装配置图文教程
  • Ruby On Rails中如何避免N+1问题
  • 艰难完成 nginx + puma 部署 rails 4的详细记录
  • 浅谈Rails 4 中Strong Parameters机制
  • Rails命令行常用操作命令简明总结

相关文章

  • print不自动换行,puts会自动换行第1/2页
  • ruby线程实现生产者消费者问题示例(队列Queue实现线程同步)
  • windows和linux下Ruby的下载与安装
  • Ruby中Time对象的常用函数总结
  • Linux系统上配置Nginx+Ruby on Rails+MySQL超攻略
  • Ruby中任务构建工具rake的入门学习教程
  • 举例理解Ruby on Rails的页面缓存机制
  • Ruby常用文件操作代码实例
  • 深入讲解Ruby中Block代码快的用法
  • Ruby on Rails基础之新建项目

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 简单对比分析Ruby on Rails 和 Laravel
    • CentOS7下搭建ruby on rails开发环境
    • Ruby基础知识之数据类型
    • 使用Ruby on Rails和PostgreSQL自动生成UUID的教程
    • Ruby和Shell脚本实现判断成绩及格功能
    • Ruby中使用each和collect进行迭代的用法
    • Ruby on Rails迁移时的一些注意事项
    • 在Ruby on Rails上使用Redis Store的方法
    • Ruby中嵌套对象转换成json的方法
    • Ruby中的类Google Map/Reduce框架Skynet介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有