首页 > Web开发, 动态语言, 挨踢(IT) > 《Agile Web Development with Rails》抄书笔记(05):Depot的初练

《Agile Web Development with Rails》抄书笔记(05):Depot的初练

2013年4月22日 发表评论 阅读评论 709 人阅读    

《Agile Web Development with Rails》抄书笔记系列

  “《Agile Web Development with Rails》抄书笔记系列”目录

  我们在上节内容最后说到,我们需要首先开发和商品信息相关的模块。那么,这一节我们就真正进入系统开发阶段。

  首要的开发任务是创建Web应用的结构,使得我们可以在其之上维护我们的产品信息,比如创建新产品,删除已有产品,删除不需要的产品等等。提前说明一点,我们将采用很小的迭代开发,小到以分钟来度量。现在开始。

  具有代表性的是,我们在每一个迭代中会再分为很对步骤,比如在迭代C中,可以有C1、C2、C3等。在本次迭代中,我们分为两步。

D瓜哥的呱呱——以后简称D呱呱

由于以前没有注意到这个细节。所以,下面的文章并不一定完全按照这个迭代来划分。

创建商品维护系统

  数据库是Depot应用的核心。提前安装、配置、测试数据库可以避免很多棘手问题。如果你不确定你到底需要什么,那么就使用默认的,这样学起来也许会更容易一些。当然,如果你很清楚你想干吗,那么Rails可以让你很容易自定义你的配置。

创建Rails应用

  在”《Agile Web Development with Rails》抄书笔记(02):Rails之初体验 ”中,想大家展示了如何创建Rails应用。我们这里按照这篇文章所述,来创建Depot应用:打开命令行工具,输入rails new 后面跟应用名,这里我们的应用名为depot。当然,需要注意的是,要确保你在一个不是已存在的应用目录里。命令如下:

// 创建Deopt应用
work> rails new depot

  我们会看到滚动地出现一堆输出。当这里完成时,我们就会发现,当前目录下有一个新创建的目录,depot。我们以后的工作就在这个目录下完成。

D呱呱

  在这里,D瓜哥就不再展示新建应用的目录结构了。想看的,请看”《Agile Web Development with Rails》抄书笔记(02):Rails之初体验 ”。

  另外,项目创建过程中,可能会看到”OpenSSL::SSL::SSLError”的错误。错误原因以及解决方法请看D瓜哥在”Ruby China”发的帖子:遇到了”SSLError”错误,有解决方法,求完善!求解释!

  英语好的童鞋,请看这里:SSL Error When Making New Rails Project。这个帖子中有D瓜哥的回复。D瓜哥英语不好,如有英语笔记好的童鞋,请劳烦修改一下我的中式英语回复。

  解释看这里:https://gist.github.com/fnichol/867550

创建数据库

  对于这个应用,我们将使用开源数据库SQLite(如果你安照书中代码来做,你也需要)。我们使用的是第三版。

D呱呱

  D瓜哥刚刚开始看这本书的时候,原计划使用MySQL数据库,但是在正版Win7系统上搞了很多次,搞的崩溃吐血都没搞成!后来,在Ubuntu 12.04上搞,很随意就搞定了。所以,计划在Window下,使用MySQL搞Rails学习的童鞋,可以考虑放一放手了,学Rails更重要,别被这个扯淡的连接MySQL蒙住了你热爱学习的双眼!

  也许有人会担心,使用SQLite开发,以后在实际部署的时候,会不会有数据库迁移问题?D瓜哥最近买了个VPS玩,首先就把本书所讲的应用(我自己做到第十章了)部署到了VPS上,同时将数据库改成了MySQL 5。整个过程很简单,很顺利!实践证明,数据库迁移毫无压力。所有细节,Rails都帮我们搞定了。

  剧透一下,以后有时间,我会把在VPS上部署Rails应用的整个过程,记录、发布出来。

  SQLite3是Rails开发的默认数据库,在” 《Agile Web Development with Rails》抄书笔记(01):环境搭建 ”已经介绍过安装方法了。使用SQLite3不需要专门创建数据库,也无需关心用户名和密码。这里让你稍微尝一下Rails的甜头。沐浴在”惯例优先配置”的春风中,有木有神清气爽的感觉?

  如果你需要使用其他数据库,而不是SQLite3,你所使用的创建数据库,授权等命令是不同的。你可以在”Rails入门指南”(Getting Started Rails Guide)中可以找到相应的帮助。

生成Scaffold

  让我们查看一下”《Agile Web Development with Rails》抄书笔记(04):Depot的概要设计 ”中的图8,应用初始化数据猜想,我们简单描述了Products表的基本字段。现在,让我们实现这个设计。我们将创建一个数据库表,一个使用该表的Rails Model,一些用户界面,还有一个用于协调整个应用的Controller。

  我们继续,去创建Model、View、Controller,同时创建products表。所有这些工作,只需要一条命令就能完成,让Rails生成关于一个指定Model的所有套件(scaffold)。有一点需要注意一下,在下面的指令中,对于Model的名称,Product,我们使用了单数形式。但是,在Rails中,会自动将数据库表名命名为Model名称的复数形式,然后Model的类名再和数据库表名进行关联。在我们下面的例子中,Model的名称是Product,那么Rails会自动将其和名称为products的表相关联。(至于Rails是如何找到表的呢?在config/database.yml中配置的开发实体会告诉Rails去哪里查找。(D瓜哥注:在config/database.yml中配置着数据库的连接信息。)对于SQLite3的用户,数据库就是在db目录下的一个文件。)

纳闷Rail是如何知道一个单词的单复数形式的?

depot>rails generate scaffold Product title:string description:text image_url:string price:decimal
      invoke  active_record
      create    db/migrate/20130418094600_create_products.rb
      create    app/models/product.rb
      invoke    test_unit
      create      test/unit/product_test.rb
      create      test/fixtures/products.yml
      invoke  resource_route
       route    resources :products
      invoke  scaffold_controller
      create    app/controllers/products_controller.rb
      invoke    erb
      create      app/views/products
      create      app/views/products/index.html.erb
      create      app/views/products/edit.html.erb
      create      app/views/products/show.html.erb
      create      app/views/products/new.html.erb
      create      app/views/products/_form.html.erb
      invoke    test_unit
      create      test/functional/products_controller_test.rb
      invoke    helper
      create      app/helpers/products_helper.rb
      invoke      test_unit
      create        test/unit/helpers/products_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/products.js.coffee
      invoke    scss
      create      app/assets/stylesheets/products.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

  这里会生出一堆文件。我们感兴趣的是一个迁移文件,名称是20130418094600_create_products.rb。(D瓜哥注:因为这个名词带时间戳。所以,自己在做的时候,可能不完全一致。)

  一个迁移文件代表我们想要对数据的一次更改,具体内容放到一个和数据库无关的文件中。这些更改会同时更新数据库以及数据库表中的数据。我们皆可以用之更新数据,还可以回滚。在以后的章节中,我们会有更详细地介绍。不过,这里,我们只需要用就行了,不需要了解太多。

  迁移文件的名称由三部分组成:世界调整时间的时间戳为前缀,名称(这里是create_products)以及文件扩展名(.rb,因为这是Ruby程序)。你看到的时间戳也许会不同。事实上,本书中的时间戳是虚构的。实际上,真是的时间戳是不可能连续的。(难道本书示例代码的时间戳是连续的?D瓜哥木有注意)实际上,真是的时间戳就是迁移脚本生成的时间。

执行迁移动作

  虽然我们已经告诉Rails,我们所需的每个属性的基本数据类型,不过,我们还是要重新定义一下price属性,将其字长定义为8,精度为2。修改代码如下:

#20130418094600_create_products.rb
class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.string :title
      t.text :description
      t.string :image_url
      t.decimal :price, precision: 8, scale: 2

      t.timestamps
    end
  end
end

  现在,可以执行这些修改了。我们需要让Rails将执行一些指令来修改我们的开发库。我们使用rake指令来完成这些工作。Rake是一个值得信赖的工具,它可以按照你的要求,完成相应的工作。这里,我们告诉Rake让它来执行一些没有执行过的修改到数据库。命令以及执行效果如下:

纳闷Rake是如何区分有木有执行过?

depot>rake db:migrate
==  CreateProducts: migrating===============================
-- create_table(:products)
   -> 0.0030s
==  CreateProducts: migrated (0.0030s) =========================

  Rake会查找所有没有执行的迁移脚本,并执行迁移工作。在这里,products会添加到database.yml文件中定义的开发库中。

  现在,万事俱备,让我们启动我们的Depot应用。我们创建了开发库,并且配置了如何连接开发库!我们创建了产品的Controller以及一个Model,并且还创建了和Model对于的数据库表,还创建了一系列的View。下面,我们看看所有的Action。

查看商品列表

  上面,使用了三条命令,我们创建了一个应用以及一个数据库(如果你使用的是其他的数据库,那么则是在已经存在的数据库中创建表)。在此之前,我们也许总以为在荧幕之后,到底发生了什么。现在,该是我们新应用闪耀登场的时候了。

  首先,我们使用如下命令来启动本地服务器:

depot>rails server
=> Booting WEBrick
=> Rails 3.2.12 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-04-18 17:52:08] INFO  WEBrick 1.3.1
[2013-04-18 17:52:08] INFO  ruby 1.9.3 (2013-02-06) [i386-mingw32]
[2013-04-18 17:52:08] INFO  WEBrick::HTTPServer#start: pid=4116 port=3000

  正如在”《Agile Web Development with Rails》抄书笔记(02):Rails之初体验”中所做的示例应用一样,这个命令会启动一个本地的Web服务器,端口号是3000。如果在启动过程中,遇到了Addressalready的错误,那么表明你可能已经在本地电脑上启动了一个Rails服务器。找到那个启动Rails服务器的命令行工具,同时按下Ctrl+C,将原来的服务器进程终止掉。如果是在Windows系统上运行的,那么你将会看到”终止批处理操作吗(Y/N)?”,很显然应该输入y。

  让我们打开浏览器,查看一下效果。在浏览器地址栏中输入127.0.0.1(或者localhost),后面跟端口号(3000),还有小写的Controller名称(products)。如下图:

Listing Products

  看来效果是相当的简陋啊!这里显示的是一个空的商品列表。让我们添加几个,点击New product的链接,接着展示出来一个表单。

New product

  这个表单是一个简单的HTML模板,就像”《Agile Web Development with Rails》抄书笔记(02):Rails之初体验”的示例程序中的一样。我们需要对其做个简单的修改,修改description属性的行数。打开#%depot%\app\views\products\_form.html.erb文件,修改后代码如下:

<%= form_for(@product) do |f| %>
  <% if @product.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2>

      <ul>
      <% @product.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description %><br />
    <%= f.text_area :description, rows: 6  %>
  </div>
  <div class="field">
    <%= f.label :image_url %><br />
    <%= f.text_field :image_url %>
  </div>
  <div class="field">
    <%= f.label :price %><br />
    <%= f.text_field :price %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

  至于更多的解释,我们以后再说明。这时,刷新一下页面,就能看到效果。然后按照属性说明,填写上所有的字段:

New product

  点击Create按钮,你会看到一个新的产品创建成功。如果此时你点击Back按钮,那么你就能在商品列表页面看到刚刚添加的商品了。

Listing Products

  虽然它不是最漂亮的界面,但是它已经正常工作了。我们可以展示给我们的客户看了。她可以简单玩一下这个应用了,详情展示,修改已有产品等。当然,我们需要给客户解释一下,这只是应用的第一步,只是由四个命令完成的工作,虽然很粗糙,但是我们希望能尽早得到她的反馈。

  此时,我们已经熟悉了关于这四个命令的东西。在进行下一步之前,我们来试试如下命令:

rake test

  会有几行输出,尾行内容是零失败,零错误等。这是单元测试和功能测试,这些测试是和Model套件一起生成的。虽然这里几乎什么也没有做,不过这让你知道了测试的存在,同时他们的通过,也增加了你的信心。更多内容,会在下一节内容来讲解。另外,鼓励你经常执行一下这个命令,它可以帮助你辨认程序中的错误。同样,更多内容,以后讲解。

  如果你使用其他数据库遇到错误,请检查你的数据库配置文件database.yml。关于数据库连接的更多内容,以后再讲解。



作 者: D瓜哥,https://www.diguage.com/
原文链接:https://wordpress.diguage.com/archives/11.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。