📅  最后修改于: 2020-10-20 05:17:33             🧑  作者: Mango
在开发Rails应用程序时,尤其是那些主要为您提供一个简单的数据库数据接口的应用程序时,使用脚手架方法通常会很有用。
脚手架提供的不仅仅是廉价的演示快感。这里有一些好处-
您可以快速将代码展示在用户面前,以获取反馈。
您会获得更快的成功。
您可以通过查看生成的代码来学习Rails的工作方式。
您可以使用脚手架作为基础来快速启动开发。
Ruby on Rails 2.0改变了Rails使用脚手架的方式。为了理解脚手架,让我们创建一个名为cookbook的数据库和一个名为recipes的表。 –
打开命令窗口,然后导航到要创建此食谱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,以创建一个复数的表名配方。但是,以上命令将生成以下消息-
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错误消息。
在这里,我们试图在编辑现有记录时提供更大的标题。仅仅由于我们添加了以上验证,就会产生以下错误消息-
如果您已经阅读了前面的章节,那么您一定已经知道我们已经创建了列出,显示,删除和创建数据的方法,但是脚手架会自动完成该工作。