`
tiny.strimp
  • 浏览: 29407 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Agile Web Development with Rails 3nd Edition学习笔记-创建Depot工程

阅读更多
    开始学习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在开发论坛上真的是非常的简单和便利了。不过这才刚刚开始。不知道之后是否会同样的简单。而那些更高级的功能以及数据的管理是否都能够很容易的实现。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics