Rails中如何单独创建MVC各个结构来代替Scaffold(脚手架)

基本上刚开始学习的人都一定会第一个接触Rails的脚手架(scaffold),也很清楚的了解过脚手架的敏捷,因为Ruby on Rails崇尚的就算敏捷开发。所以我现在在这里简单的介绍一下Scaffold,让大家了解一下Rails的魅力。

利用Scaffold快速为表创建模型、视图、控制器和迁移

首先我使用的是Rails3.2.1的版本和在Ubuntu11.10下进行操作,我们先建立一个Rails的项目,名字就叫“test1”吧。

创建rails项目命令和生成文件
ray@ray-ThinkPad-SL:~/Project$ rails new test1  #rails new 项目名称,就可以自动创建
create
create README.rdoc
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
create app/assets/images/rails.png
create app/assets/javascripts/application.js
create app/assets/stylesheets/application.css
create app/controllers/application_controller.rb
create app/helpers/application_helper.rb
create app/mailers
create app/models
create app/views/layouts/application.html.erb
create app/mailers/.gitkeep
create app/models/.gitkeep
create config
create config/routes.rb
create config/application.rb
create config/environment.rb
create config/environments
create config/environments/development.rb
create config/environments/production.rb
create config/environments/test.rb
create config/initializers
create config/initializers/backtrace_silencers.rb
create config/initializers/inflections.rb
create config/initializers/mime_types.rb
create config/initializers/secret_token.rb
create config/initializers/session_store.rb
create config/initializers/wrap_parameters.rb
create config/locales
create config/locales/en.yml
create config/boot.rb
create config/database.yml
create db
create db/seeds.rb
create doc
create doc/README_FOR_APP
create lib
create lib/tasks
create lib/tasks/.gitkeep
create lib/assets
create lib/assets/.gitkeep
create log
create log/.gitkeep
create public
create public/404.html
create public/422.html
create public/500.html
create public/favicon.ico
create public/index.html
create public/robots.txt
create script
create script/rails
create test/fixtures
create test/fixtures/.gitkeep
create test/functional
create test/functional/.gitkeep
create test/integration
create test/integration/.gitkeep
create test/unit
create test/unit/.gitkeep
create test/performance/browsing_test.rb
create test/test_helper.rb
create tmp/cache
create tmp/cache/assets
create vendor/assets/javascripts
create vendor/assets/javascripts/.gitkeep
create vendor/assets/stylesheets
create vendor/assets/stylesheets/.gitkeep
create vendor/plugins
create vendor/plugins/.gitkeep
run bundle install

在终端上输入一行命令,项目就已经生成了,里面的各个目录什么作用,我这里就不做详细的解释了。然后我们利用脚手架(scaffold),快速生成MVC结构,如果我们在使用JAVA搭建MVC的时候,利用SSH,总要写很多个XML文件,现在我们Rails中,使用一条命令行,就可以完成工作。

ray@ray-ThinkPad-SL:~/Project/test1$ rails generate scaffold Book \title:string storage:date description:text price:decimal
#在数据库中创建表book
invoke active_record
create db/migrate/20120320025605_create_books.rb #数据迁移文件
create app/models/book.rb #model文件
invoke test_unit
create test/unit/book_test.rb
create test/fixtures/books.yml
route resources :books
invoke scaffold_controller
create app/controllers/books_controller.rb #controller文件
invoke erb
create app/views/books #view
create app/views/books/index.html.erb
create app/views/books/edit.html.erb
create app/views/books/show.html.erb
create app/views/books/new.html.erb
create app/views/books/_form.html.erb
invoke test_unit
create test/functional/books_controller_test.rb #测试文件
invoke helper
create app/helpers/books_helper.rb
invoke test_unit
create test/unit/helpers/books_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/books.js.coffee
invoke scss
create app/assets/stylesheets/books.css.scss
invoke scss
create app/assets/stylesheets/scaffolds.css.scss

然后数据迁移之后,就可以看看每个页面了。

ray@ray-ThinkPad-SL:~/Project/test1$ rake db:migrate
== CreateBooks: migrating ====================================================
-- create_table(:books)
-> 0.0018s
== CreateBooks: migrated (0.0019s) ===========================================

首先我们来看看books controller的index页面。
books index

然后点击new books:
new book

创建成功之后,跳转到show.html页面。
show books

返回主页,可以看到创建好的books1,并且可以对其进行show,edit,destroy的操作。
books index
就这么轻松的就把模型、视图、控制器完成了,需要更改的地方可以到对应的文件进行编辑。

可是有时候,你可能会觉得,这样下来需要编辑的地方太多了,而且生成了很多自己不必要的文件,或者你想更清楚的了解创建MVC的整个过程。那请你继续往下看,我们分别用generate创建controller,view和model,还有migrate(数据迁移)。

告别Scaffold,分别创建controller,view和model,还有migrate

首先,我们创建控制器books和视图的index主页:

ray@ray-ThinkPad-SL:~/Project/test2$ rails generate controller books index
create app/controllers/books_controller.rb
route get "books/index"
invoke erb
create app/views/books
create app/views/books/index.html.erb
invoke test_unit
create test/functional/books_controller_test.rb
invoke helper
create app/helpers/books_helper.rb
invoke test_unit
create test/unit/helpers/books_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/books.js.coffee
invoke scss
create app/assets/stylesheets/books.css.scss

在上面的创建中,我们可以看到其中一行为“route get "books/index" ”这里是在路由规则中添加了对应的信息,这里我们把原来添加的删掉换成如下路由信息:

#config/routes.rb
Test2::Application.routes.draw do
resources :books #RESTful路由法则
end

其中这里有更多关于RESTful的解释  http://ihower.tw/rails3/restful.html

打开books的控制器,我们可以看到如下代码。

#app/controllers/books_controller.rb
class BooksController < ApplicationController
def index
end
end

现在我们首先需要在主页中,添加“新建”的按钮。

<!-- app/views/books/index.html.erb  -->
<!-- 把本来有的信息删除,"new_book_path"属于rails中的RESTful路由法则 -->
<%= link_to "新书入库", new_book_path %>

而当我们点击“新书入库”的时候将会出现错误,因为在控制器books中,我们没有new的方法,所以我们创建new方法,在次打开控制器。

#app/controllers/books_controller.rb
class BooksController < ApplicationController
def index
end

def new #创建new方法
@book = Book.new #创建变量@book
end
end

Book这个类中,我们需要通过一个model(模型)去进行与数据库的链接这也就是模型的最关键的作用,使得我们新创建的book,可以保存在数据库中。因此我们现在需要运行下面的命令来创建我们的第一个模型:

ray@ray-ThinkPad-SL:~/Project/test2$ rails generate model book name:string
invoke active_record
create db/migrate/20120320075821_create_books.rb #迁移文件
create app/models/book.rb #model(模型)
invoke test_unit
create test/unit/book_test.rb
create test/fixtures/books.yml

现在我们解释一下迁移文件在这里的关键作用,每一次需要在数据库中添加表或者改变数据库的结构的时候,我们都会生成一个迁移文件。它可以对数据库
进行有效版本控制,所以的数据迁移都是一个Ruby类,我们可以对其进行编辑,来确定我们需要生成的数据类型,我们先打开迁移文件看看。

#db/migrate/[date]_create_books.rb

class CreateBooks < ActiveRecord::Migration
def change #Rails3.1以上版本,都由change方法进行控制
create_table :books do |t| #生成books表
t.string :name

t.timestamps
end
end
end

当你运行迁移(rake db:migrate)的时候,books的表将会在数据库中创建;当你执行回滚(rake db:rollback)的时候,book的表将会在数据库中删除。

ray@ray-ThinkPad-SL:~/Project/test2$ rake db:migrate
== CreateBooks: migrating ====================================================
-- create_table(:books)
-> 0.0033s
== CreateBooks: migrated (0.0035s) ===========================================

好!现在数据库的表已经创建成功了,我们需要完成一个视图,就算new的页面,在views的books目录下,我们新建两个文件分别是“_form.html.erb”和“new.html.erb”,“_form.html.erb”为partial(局部板块),有利于你减少重复的代码,因为我们等会在edit的视图中也需要用到form。现在我们先将以下代码加入局部板块中:

<!-- app/views/books/_form.html.erb  -->
<%
= form_for(@book) do |f| %>
<p>
<%= f.label :name, "书名:" %>
<%= f.text_field :name %>
</p>
<%= f.submit "创建" %>
<% end %>

然后在“new.html.erb”把“_form.html.erb”导入到进去,使用render即可,如下:

<!-- app/views/books/new.html.erb -->
<h2>新书入库</h2>
<%= render "form" %>

好的,我们运行页面之后,可以看到如下的页面。
新书入库

当我们兴致勃勃的准备把书名添加进去的时候,错误就出现了,浏览器提示如下错误:

Unknown action

The action 'create' could not be found for BooksController

原因是”创建“按钮链接的是’create‘方法,所以我们需要在books类里面,创建这个方法:

#app/controllers/books_controller.rb
def create
@book = Book.new(params[:book])
@book.save
redirect_to @book
end

好了,创建了之后需要带我们去到一个show的页面,所以我们需要在视图中,建立一个show.html.erb并加入一下代码:

<!-- app/views/books/show.html.erb -->
<h2><%= @book.name %></h2>

并且在控制器books中,定义一个show的方法:

#app/controllers/books_controller.rb
def show
@book = Book.find(params[:id])
end

这样就创建了一个简单的网站结构,我们可以从中了解到其实MVC的架构本来在Rails的框架中就存在的,这样整个代码结构变得非常的清晰,所有底层的配置都已经通过Rails搭建好了,这样我们可以更加专注的在编码上面,变得更加的高效。虽然本文写的都是写比较简单的东西,但是我们可以很清楚的了解到Rails的魅力拉~

posted on 2012-03-20 20:46  jesktop  阅读(2522)  评论(0编辑  收藏  举报

导航