- 学习 Ruby on Rails
- Rails 2.1 主页
- Rails 2.1 简介
- 导轨 2.1 安装
- Rails 2.1 框架
- Rails 2.1 目录结构
- Rails 2.1 示例
- Rails 2.1 数据库设置
- Rails 2.1 活动记录
- Rails 2.1 迁移
- Rails 2.1 控制器
- Rails 2.1 视图
- Rails 2.1 布局
- Rails 2.1 脚手架
- Rails 2.1 和 AJAX
- Rails 2.1 上传文件
- Rails 2.1 发送电子邮件
- 高级 Ruby on Rails 2.1
- Rails 2.1 RMagick 指南
- Rails 2.1 基本 HTTP 身份验证
- Rails 2.1 错误处理
- Rails 2.1 路线系统
- Rails 2.1 单元测试
- 高级 Ruby on Rails 2.1
- Rails 2.1 提示与技巧
- 快速参考指南
- 快速参考指南
- Ruby on Rails 2.1 有用资源
- Ruby on Rails 2.1 - 资源
- Ruby on Rails 2.1 - 讨论
Ruby on Rails 2.1 - 脚手架
当您开发 Rails 应用程序时,尤其是那些主要为您提供数据库中数据的简单接口的应用程序时,使用脚手架方法通常很有用。
脚手架提供的不仅仅是廉价的演示刺激。以下是一些好处 -
您可以快速将代码提供给用户以获取反馈。
您受到更快成功的激励。
您可以通过查看生成的代码来了解 Rails 的工作原理。
您可以使用脚手架作为基础来快速启动您的开发。
脚手架示例
Ruby on Rails 2.0 改变了 Rails 使用脚手架的方式。为了理解脚手架,让我们创建一个名为Cookbook的数据库和一个名为Recipes的表。-
创建空的 Rails Web 应用程序
打开命令窗口并导航到要创建此食谱Web 应用程序的位置。我们使用 c:\ruby。运行以下命令创建完整的目录结构和所需的.yml文件 MySQL 数据库。
C:\ruby> rails -d mysql cookbook
这里我们使用-d mysql选项来指定我们使用 MySQL 数据库的兴趣。我们可以使用-d选项指定任何其他数据库名称,例如oracle或postgress。默认情况下,Rails 使用SQLite数据库。
设置数据库
这是创建数据库的方法 -
mysql> create database cookbook; Query OK, 1 row affected (0.01 sec) mysql> grant all privileges on cookbook.* to 'root'@'localhost' identified by 'password'; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
要指示 Rails 找到数据库,请编辑配置文件 ~\cookbook\config\database.yml 并将数据库名称更改为 Cookbook。完成后,它应该如下所示 -
development: adapter: mysql encoding: utf8 database: cookbook username: root password: password host: localhost test: adapter: mysql encoding: utf8 database: cookbook username: root password: password host: localhost production: adapter: mysql encoding: utf8 database: cookbook username: root password: password host: localhost
注意- 如果您想使用除 MySQL 之外的任何其他数据库,您可以对其他数据库适配器使用类似的设置。
Rails 允许您使用不同的数据库在开发模式、测试模式或生产模式下运行。该应用程序为每个应用程序使用相同的数据库。
数据库表定义
假设我们的食谱表具有以下结构-
id INT(11) title VARCHAR(40) chef VARCHAR(40) instructions VARCHAR(255)
生成的脚手架代码
通过脚手架操作,Rails 动态生成它需要的所有代码。通过将脚手架作为脚本运行,生成模型、脚手架和所需的数据库迁移脚本以及控制器、帮助程序和测试支持文件,如下所示 -
cookbook> ruby script/generate scaffold Recipe title:string \ chef:string instructions:text
注意单数名称Recipe来创建复数表名称recipes。但是,上述命令将生成以下消息 -
exists app/models/ exists app/controllers/ exists app/helpers/ create app/views/recipes exists app/views/layouts/ exists test/functional/ exists test/unit/ exists public/stylesheets/ create app/views/recipes/index.html.erb create app/views/recipes/show.html.erb create app/views/recipes/new.html.erb create app/views/recipes/edit.html.erb create app/views/layouts/recipes.html.erb create public/stylesheets/scaffold.css create app/controllers/recipes_controller.rb create test/functional/recipes_controller_test.rb create app/helpers/recipes_helper.rb route map.resources :recipes dependency model exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/recipe.rb create test/unit/recipe_test.rb create test/fixtures/recipes.yml create db/migrate create db/migrate/20080614192220_create_recipes.rb cookbook>
现在,让我们看看幕后发生了什么。
控制器
让我们看一下控制器背后的代码。该代码由脚手架生成器生成。如果你打开 app/controllers/recipes_controller.rb,你会发现如下内容 -
class RecipesController < ApplicationController # GET /recipes # GET /recipes.xml def index @recipes = Recipe.find(:all) respond_to do |format| format.html # index.html.erb format.xml { render :xml => @recipes } end end # GET /recipes/1 # GET /recipes/1.xml def show @recipe = Recipe.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @recipe } end end # GET /recipes/new # GET /recipes/new.xml def new @recipe = Recipe.new respond_to do |format| format.html # new.html.erb format.xml { render :xml => @recipe } end end # GET /recipes/1/edit def edit @recipe = Recipe.find(params[:id]) end # POST /recipes # POST /recipes.xml def create @recipe = Recipe.new(params[:recipe]) respond_to do |format| if @recipe.save flash[:notice] = 'Recipe was successfully created.' format.html { redirect_to(@recipe) } format.xml { render :xml => @recipe, :status => :created, :location => @recipe } else format.html { render :action => "new" } format.xml { render :xml => @recipe.errors, :status => :unprocessable_entity } end end end # PUT /recipes/1 # PUT /recipes/1.xml def update @recipe = Recipe.find(params[:id]) respond_to do |format| if @recipe.update_attributes(params[:recipe]) flash[:notice] = 'Recipe was successfully updated.' format.html { redirect_to(@recipe) } format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @recipe.errors, :status => :unprocessable_entity } end end # DELETE /recipes/1 # DELETE /recipes/1.xml def destroy @recipe = Recipe.find(params[:id]) @recipe.destroy respond_to do |format| format.html { redirect_to(recipes_url) } format.xml { head :ok } end end end
该文件自动实现了所有方法。您可以使用这些可用方法执行任何创建、读取、删除或编辑操作。
当Rails应用程序的用户选择一个操作时,例如“Show” - 控制器将执行相应部分中的任何代码 - “def show” - 然后默认情况下将渲染一个同名的模板 - “show.html .erb”。可以通过覆盖任何模板中的代码来覆盖此默认Behave。-
控制器使用 ActiveRecord 方法(例如find、find_all、new、save、update_attributes 和 destroy)将数据移入和移出数据库表。请注意,您不必编写任何 SQL 语句,Rails 会自动处理它。
观点
所有视图和相应的控制器方法都是由scaffold命令创建的,它们位于app/views/recipes目录中。您将在此目录中包含以下文件 -
index.html.erb - 这是显示默认页面的模板文件,当您输入 http://127.0.0.1:3000/recipes 时将执行。
new.html.erb - 这是创建新配方的模板,每当您尝试创建新配方时都会执行。
show.html.erb - 这是显示数据库中所有食谱的模板,每当您尝试查看所有食谱时都会执行。
edit.html.erb - 这是编辑数据库中任何食谱的模板,每当您尝试编辑任何食谱时都会执行。
我们建议您一一打开这些文件并尝试了解它们的源代码。
迁徙
您将在~/cookbook/db/migrate子目录中找到创建的迁移文件。该文件将包含以下内容 -
class CreateRecipes < ActiveRecord::Migration def self.up create_table :recipes do |t| t.string :title t.string :chef t.text :instructions t.timestamps end end def self.down drop_table :recipes end end
要在数据库中创建所需的文件,请使用帮助程序脚本,如下所示。
cookbook> rake db:migrate
此命令将在您的食谱数据库中创建菜谱和schema_migrations表。在继续之前,请确保您已在数据库中成功创建所需的表。
准备测试
上述所有步骤都会使您的数据库表变得生动起来。它为您的数据提供了一个简单的界面,以及以下方式 -
- 创建新条目
- 编辑当前条目
- 查看当前条目
- 销毁当前条目
创建或编辑条目时,脚手架将完成表单生成和处理的所有艰苦工作。它甚至会提供巧妙的表单生成,支持以下类型的输入 -
- 简单的文本字符串
- 文本区域(或大块文本)
- 日期选择器
- 日期时间选择器
现在,转到 Cookbook 目录并使用以下命令运行 Web 服务器 -
cookbook> ruby script/server
现在,打开浏览器并导航至 http://127.0.0.1:3000/recipes/new。它将为您提供一个在食谱表中创建新条目的屏幕。屏幕截图如下所示 -
现在,在给定的文本框中输入一些值,然后按“创建”按钮创建一个新配方。您的记录将添加到食谱表中,并显示以下结果 -
您可以使用“编辑”选项来编辑配方,也可以使用“后退”按钮转到上一页。假设您按下了“后退”按钮,它将显示数据库中所有可用的食谱。由于我们的数据库中只有一条记录,因此它将向您显示以下屏幕 -
此屏幕使您可以选择查看配方表的完整详细信息。此外,它还提供编辑甚至删除表的选项。
增强模型
Rails 免费为您提供了很多错误处理功能。要理解这一点,请向空配方模型添加一些验证规则 -
修改~/cookbook/app/models/recipe.rb如下,然后测试您的应用程序 -
class Recipe < ActiveRecord::Base validates_length_of :title, :within => 1..20 validates_uniqueness_of :title, :message => "already exists" end
这些条目将进行自动检查,例如 -
validates_length_of - 该字段不是空白也不是太长。
validates_uniqueness_of - 捕获重复值。我们提供了自定义消息,而不是默认的 Rails 错误消息。
在这里,我们尝试在编辑现有记录时提供更大的标题。它会产生以下错误消息,只是因为我们添加了上述验证 -
脚手架有何不同?
如果您已经阅读了前面的章节,那么您一定已经看到我们创建了列出、显示、删除和创建数据的方法,但脚手架会自动完成这项工作。