📜  Ruby on Rails 2.1-脚手架

📅  最后修改于: 2020-10-20 05:17:33             🧑  作者: Mango


在开发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选项指定其他任何数据库名称,例如oraclepostgress 。默认情况下,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,以创建一个复数的表名配方。但是,以上命令将生成以下消息-

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”。可以通过覆盖任何模板中的代码来覆盖此默认行为。 –

控制器使用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。它会为您提供一个在配方表中创建新条目的屏幕。屏幕截图如下所示-

创建配方

现在,在给定的文本框中输入一些值,然后按Create(创建)按钮创建一个新配方。您的记录被添加到配方表中,并显示以下结果-

新增食谱

您可以使用“编辑”选项来编辑配方,也可以使用“上一步”按钮转到上一页。假设您按下了“返回”按钮,它将显示数据库中所有可用的配方。由于我们的数据库中只有一条记录,它将显示以下屏幕:

后食谱

该屏幕为您提供了查看配方表的完整详细信息的选项。另外,它提供了编辑或什至删除表的选项。

加强模型

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错误消息。

在这里,我们试图在编辑现有记录时提供更大的标题。仅仅由于我们添加了以上验证,就会产生以下错误消息-

增加了错误

脚手架有何不同?

如果您已经阅读了前面的章节,那么您一定已经知道我们已经创建了列出,显示,删除和创建数据的方法,但是脚手架会自动完成该工作。