开始学习ROR了,由于在开始跟着书做这个Depot工程时才决定把整个过程整理出来写成博客的,所以书开始部分讲的环境安装部分都没有整理。等以后再补充上来吧。
由于是刚刚开始学这个,所以在实验和总结的时候还是有一些疑问。在下面的内容中也都记录了下来。以便以后能够把曾遇到的问题逐个解决。当然,如果看了我总结的内容的朋友有知道答案的,还望指点小弟一二。另外,如果我描述的东西有哪里不正确的。还望朋友们指出。谢谢!
1. 创建Depot工程
创建一个使用MySQL作为后台数据库的Rails工程
引用
rails --database=mysql depot
工程创建好之后,数据库的配置信息在生成的depot/config/database.yml文件中。
内容如下:
引用
development:
adapter: mysql
encoding: utf8
database: depot_development
username: root
password:
host: localhost
如果需要,可以修改生成的数据库名称,以及用户名。
如果用户名不填,则使用使用者的登录用户访问数据库。
2. 创建开发数据库
引用
mysqladmin -u root -p create depot_development
该命令将创建一个没有任何表格的空数据库。数据库名为depot_development。
3. 测试数据库设置:
引用
rake db:create RAILS_ENV='development'
在实验的时候,执行这条命令之后出现了如下错误信息:
引用
Couldn't create database for {"encoding"=>"utf8","username"=>"root",
"adapter"=>"mysql","database"=>"depot_development", "pool"=>5,
"password"=>nil,"socket"=>"/var/run/mysqld/mysqld.sock"},
charset: utf8,collation: utf8_general_ci (if you set the charset
manually,make sure you have a matching collation)
在网上查了一下,原来是没有权限访问数据库。因为默认生成的数据库配置信息中的password字段没有设置。简单的设置该字段之后问题解决。
问题:
是不是可以不在这里填写数据库访问的密码呢?感觉很不安全的说。不知道后面是不是有关于这个问题的说明。等看到了再在这里增加解决方法吧。
还有个问题,就是是不是如果没有进行第二步的操作创建空数据库的话,这条命令是否能够自动的创建数据库呢?没有尝试。问题先留在这里。等跟着书上的介绍把这个Depot做完了之后再实验吧。
引用
rake db:migrate
这条命令其实会访问数据库,并在数据库中生成一个名为schema_migrations的表。这个表用来维护每次执行该命令时,使用depot/db/migrate/YYYYMMDDXXXXXX_create_products.rb文件名中YYYMMDDXXXXXX部分作为‘Version’来管理表的变更信息。
问题:
上面Version中的XXXXXX部分,从格式来看,应该是该rb文件生成的时分秒信息。但是看了实验时生成的值和生成该文件的时间之后,发现根本匹配不上。所以不知道是什么了。也就没有写成HHmmss来描述。)
回答:
经过后面实验时的观察,XXXXXX部分的值为格林威治时间。也就是0时区的时间。所以migrate文件的文件名规则为<YYYYMMDDHHmmss>-<operation>.rb。
4. 创建Products模块,并生成表
引用
ruby depot/script/generate scaffold product \
title:string description:text image_url:string
该命令将会生成如下信息:
引用
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/products
exists app/views/layouts/
exists test/functional/
exists test/unit/
exists public/stylesheets/
create app/views/products/index.html.erb
create app/views/products/show.html.erb
create app/views/products/new.html.erb
create app/views/products/edit.html.erb
create app/views/layouts/products.html.erb
create public/stylesheets/scaffold.css
create app/controllers/products_controller.rb
create test/functional/products_controller_test.rb
create app/helpers/products_helper.rb
route map.resources :products
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/product.rb
create test/unit/product_test.rb
create test/fixtures/products.yml
create db/migrate
create db/migrate/20080601000001_create_products.rb
这里就可以看到那个用来创建数据库表的rb文件了。
其实表中的字段是由这条命令中第二行的内容指定的。具体字段和类型为:
引用
title:string # 字段:title 类型:string
description:text # 字段:description 类型:text
image_url:string # 字段:image_url 类型:string
问题:
通过ruby script/generate scaffold -h查看该命令的格式是:
script/generate scaffold ModelName [field:type, field:type]
这里只能指定字段的名称和类型,那么怎么指定字段是必填字段还是非必填字段呢?
生成products表:
引用
rake db:migrate
这条命令将会使用刚生成的db/migrate/20080601000001_create_products.rb文件来创建表和其中的字段。并将“20080601000001”作为Version字段的值填写到schema_migrations表中。
从生成的表可以看到,该命令除了按照我们指定的字段名和类型生成了相应的字段外,还生成了如下
4个字段:
引用
id:integer
created_at:datetime
updated_at:datetime
:
其中,id字段是必填并且自动增加的字段。而最后那个既没有名字也没有类型的字段是必填字段。其它我们指定的字段都不是必填字段。
问题:
1. 最后那个字段是什么?做什么用的?
2. 我们指定的字段怎么设置成必填字段呢?
5. 运行
到现在,我们还没有写一行代码,但是这个工程已经可以带着数据库运行了。
运行下面的命令启动Web服务:
引用
ruby script/server
在浏览器地址栏中输入
引用
http://localhost:3000/products
我们就可以看到Product部分的运行情况了。默认生成代码为我们提供了一个和论坛很类似的界面。虽然界面还是非常非常的简单和原始,但是基本的功能却都具有了。我们可以添加新的“帖子”,查看“帖子“列表,并可以查看、修改或者删除一个“帖子“。
从这点来看,ROR在开发论坛上真的是非常的简单和便利了。不过这才刚刚开始。不知道之后是否会同样的简单。而那些更高级的功能以及数据的管理是否都能够很容易的实现。