应用Rails进行敏捷Web开发(学习笔记)-4.任务A:货品维护

 
第1章 任务A:货品维护
1.1 迭代A1:跑起来再说
第一个迭代我们需要做以下工作:
n        创建一个Rails应用程序
n        创建一个数据库,在其中保存需要的信息
n        创建用于保存货品信息的数据表
n        配置应用程序,使之指向我人瓣数据库
n        让Rails帮我们生成“货品维护”应用的最初版本
1.1.1 创建Rails应用程序
这一步我们已经很熟练了,只要在命令行下输入rails + 项目名称即可。在这里我们的项目叫depot,因此输入:
rails depot
然后等一堆信息滚过后,就会看到一个depot新目录。
1.1.2 创建数据库
我们的数据库是使用MySQL,我们要创建三个数据库:
n        depot_development将在开发阶段使用,我们的编程工作都将使用这个数据库。
n        depot_test是测试数据库。这个库里的数据不会被持久保存,所以正好用于执行测试,每个测试执行之前都可以将数据库清空,以便获得一个于净的运行环境。
n        depot_production是生产数据库,当我们把应用程序发布上线之后,就会使用这个库。
这里就不把创建数据库的sql写出来了,因为我觉得用MySQL Control Center创建数据库更方便。
1.1.3 创建货品表
# 主机: localhost
# 数据库: depot_development
# 表: 'products'
#
CREATE TABLE `products` (
 `id` int(11) NOT NULL auto_increment,
 `title` varchar(100) NOT NULL default '',
 `description` text NOT NULL,
 `image_url` varchar(200) NOT NULL default '',
 `price` decimal(10,2) NOT NULL default '0.00',
 PRIMARY KEY (`id`)
) TYPE=MyISAM;
 
1.1.4 配置应用程序
我们需要在配置文件中描述数据连接信息,以便我们的应用与数据库相连,这些信息会放在config/database.yml文件中。
database.xml内容有三部分构成,分别代表开发、测试和生产数据库的配置。
现在编辑这个配置文件,将三部分内容与刚刚创建的三个数据库相匹配。
# 开发阶段
development:
 adapter: mysql
 database: depot_development
 username: root
 password: password
 host: localhost
# 测试阶段
test:
 adapter: mysql
 database: depot_test
 username: root
 password: password
 host: localhost
# 生产阶段
production:
 adapter: mysql
 database: depot_production
 username: root
 password: password
 host: localhost
1.1.5 创建“货品维护”应用
好了,已经做了以下的准备工作:
n        创建Depot应用
n        创建数据库和products表
n        对应用程序进行配置,使其连接到数据库
现在我们可以支暂行编写“货品维护”的应用了,张新天地可以着手写代码了,代码阶段是大多程序员最急于和乐于干的阶段,但我认为这是一个不好的习惯,我一直认为,如果前期工作准备的了,代码阶段会很短,代码量会很少。
开始吧!!!!!!!!!!!!!!!!!
在命令窗口下键入:
   E:/work/rails/depot>ruby script/generate scaffold product Admin
      exists app/controllers/
      exists app/helpers/
      exists app/views/admin
      exists test/functional/
 dependency model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
   identical    app/models/product.rb
   identical    test/unit/product_test.rb
   identical    test/fixtures/products.yml
      create app/views/admin/_form.rhtml
      create app/views/admin/list.rhtml
      create app/views/admin/show.rhtml
      create app/views/admin/new.rhtml
      create app/views/admin/edit.rhtml
      create app/controllers/admin_controller.rb
      create test/functional/admin_controller_test.rb
      create app/helpers/admin_helper.rb
      create app/views/layouts/admin.rhtml
      create public/stylesheets/scaffold.css
这一条命令就生成一个基本的“货品维护”应用。
Product参数代表我们想要的模型名称
Admin参数代表控制器名称
现在我们要做的是看看结果,还在命令窗口下键入
   E:/work/rails/depot>ruby script/server
这时会在本地主机启动一个web服务器,使用3000端口。
我们在浏览器中输入 http://127.0.0.1:3000/admin,admin就是我们要访问控制器的名称。就会看到一个简易的货品列表页面.
好我,我们现在来添加我们的第一条数据:
n        点击“New product”链接,就会出现一张表单,细仔看一看,表单中的元素与我们数据库中的字段是一致。
n        直写好表单之后,点击“Create”按钮,你会看到新建的货品出现在列表中。
n        再看看数据库,确实增加了一条数据记录(费放)
n        在列表页面,可以在每条数据后面看到“Show”、“
Edit” 、“Destroy”三个操作链接,分别代表“显示”、“编辑”、“删除”三个操作。
现在重新来看一下这个应用,增、删、改、查都已经完成了,虽然界面很丑。
1.1.6 Rails脚手架
所谓“Rails”脚手架是由Rails自动生成的、用于处理模型的基本框架。在运行生成器时,我们告诉它:为哪个模型创建脚手架,以及能冠军哪个控制器来访问它。模型和控制器的代码都将由Rails自动生成。
模型关联:
在Rails中,模型会自动映射到数据库中的一张表,表名就是模型类的复数形式。在这里,我们的模型是product,因此Rails会与products表关联起来。
控制器请求:
控制器负责处理浏览器的请求。一个应用可以有多个控制器。在搭建“货品维护”的脚手架时,我们将控制器命名为Admin,所以访问这一功能的URL路径也要以admin开头。
1.2 迭代A2:添加缺失的字段
我们需要添加一些字段:在“货品详细信息”的窗口中应该有“可用日期”这个字段。
我在数据库表中添加这个字段。更改数据库结构:
   alter table products add column date_available datetime;
    在数据结构改变的同时,我们的脚手架代码也要进行升级。我们可以重新生成它们。
E:/work/rails/depot>ruby script/generate scaffold Product Admin
刷新游览器,新建一个货品,看看页面的变化吧。(说实在的,我倒没觉得Rails在这点上有什么神奇之处)
1.3 迭代A3:检查一下
现在我们加入对表单输入项的合法校验。
我们的验证规则是:
n        任何文本字段不可为空
n        图片url要符合url规则
n        定价必须为数字
现在我们开始编写检证逻辑:
我们编辑模型类(app/models/product.rb)文件,看看它现在的样子
class Product < ActiveRecord::Base
end
这里Product继承了ActiveRecord::Base,在这个父类里面已经实现了我们刚刚的一些操作(数据库映射、记录创建、更新、查找……),这就是继承的好处。
现在我们要加入检证功能了
1.3.1 所有文本输入不可为空
class Product < ActiveRecord::Base
   validates_presence_of :title, :description, :image_url
end
validates_presonce_of()方法是一个标准的Rails验证器,它会检查指定的一个(或一组)字段存在,并且值不为空。
我们在修改product.rb文件后,应用会立即生效,不生重新启动服务。这就是动态语言吗。
1.3.2 价格为数字
接下来我们对价格进行验证,这回会用到validates_numericality_of()方法。
  validates_numericality_of :price
刷新页面,在价格一栏中,输入非数字,看看效果吧!!!
1.3.3 对价格字段进一步检验
我们需要检查价格字段的值大于0,我们需要编写一个 validate()的方法。Rails在保存Product实例之前会自动调用这个方法,我们可以在这个方法中来校验字段的合法性。我们将这个方法的可见性定为protected,因为该方法必须在特定的模型上下文中调用,不能在外部随便调用。
   protected
   def validate
          errors.add(:price, "shold be positive") unless price.nil? || price>=0.01  
   end
如果输入的价格小于等于0,validate()方法就会调用errors.add()方法来记录这个错误。
errors.add()第一个参数是字段的名称,第二个参数是出错信息的正文。
我们首先确保price字段不为空,然后将与0.0进行比较。如果字段为nil,进行这们的比较就会抛出异常。
1.3.4 确保title独一无二
现在我们希望每样货品都有一个独一无二的名称。
validates_uniqueness_of :title
1.3.5 验证url图片地址合法
可以用validates_formate_of()方法来实现这一需求,该方法会检查一个字段与给定的正则表达式是否匹配。现在,我们只检查 URL是否以“http:”开头,并且以“.gif”、“.jpg”或者“.png”其中之一结束。
validates_format_of :image_url,
             :with => %r{^http:.+/.(gif|jpg|png)$}i,
             :message => "must be a URL for a GIF,JPG or PNG image"
1.3.6 完成的代码
class Product < ActiveRecord::Base
 
   validates_presence_of :title, :description, :image_url
  
   validates_numericality_of :price
  
   validates_uniqueness_of :title
  
   validates_format_of :image_url,
                       :with => %r{^http:.+/.(gif|jpg|png)$}i,
                       :message => "must be a URL for a GIF,JPG or PNG image"
  
   protected
   def validate
          errors.add(:price, "shold be positive") unless price.nil? || price>=0.01
   end
end
1.4 迭代A4:更美观的列表页
我们现在需要在列表中显示图片。
现在修改app/views/admin/list.rhtml文件
现在我们来看看由脚手架生成器自动生成的源文件,如下:
<h1>Listing products</h1>
 
<table>
 <tr>
 <% for column in Product.content_columns %>
    <th><%= column.human_name %></th>
 <% end %>
 </tr>
 
<% for product in @products %>
 <tr>
 <% for column in Product.content_columns %>
    <td><%=h product.send(column.name) %></td>
 <% end %>
    <td><%= link_to 'Show', :action => 'show', :id => product %></td>
    <td><%= link_to 'Edit', :action => 'edit', :id => product %></td>
    <td><%= link_to 'Destroy', { :action => 'destroy', :id => product }, :confirm => 'Are you sure?', :post => true %></td>
 </tr>
<% end %>
</table>
 
<%= link_to 'Previous page', { :page => @product_pages.current.previous } if @product_pages.current.previous %>
<%= link_to 'Next page', { :page => @product_pages.current.next } if @product_pages.current.next %>
 
<br />
 
<%= link_to 'New product', :action => 'new' %>
视图使用了 ERb来迭代遍历Product模型类的的有字段,并为@products数组(该数组由控制器中的list方法设置)中的每条货品记录创建表格中的一行。
现在我们把它改得漂亮一些:
<h1>Listing products</h1>
 
<table cellpadding="5" cellspacing="0">
<%
   odd_or_even = 0
   for product in @products
          odd_or_even = 1 - odd_or_even
%>
 <tr valign="top" class="ListLine<%=odd_or_even%>">
        <td>
               <img width="60" height="70" src="<%=product.image_url%> "/>
        </td>
        <td width="60%">
               <span class="ListTitle">
                      <%= h(product.title) %>
               </span><br/>
               <%= h(truncate(product.description,80)) %>
        </td>
        <td align="right">
               <%= product.date_available.strftime("%y-%m-%d") %>
               <br/>
               <strong>$<%= sprintf("%0.2f",product.price) %></strong>
        </td>
        <td class="ListActions">
               <%= link_to 'Show', :action => 'show', :id =>product %> <br/>
               <%= link_to 'Edit', :action => 'edit', :id =>product %> <br/>
               <%= link_to 'Destroy', { :action => 'destroy', :id => product},:confirm => "Are you sure?" %>
        </td>
 </tr>
 <% end %>
       
 
</table>
 
<%= if @product_pages.current.previous
                 link_to ("Previous page",{:page => @product_pages.current.previous})
          end 
%>
<%= if @product_pages.current.next
                 link_to("Next Page",{:page => @product_pages.current.next})
    end
%>
<br />
 
<%= link_to 'New product', :action => 'new' %>
我们借助odd_or_even变量来为奇、偶表格行赋以不同的样式类,与css进行关联。使用Ruby的sprintf()方法将浮点数类型的“货品价格”转换成格式化之后的字符串。
现在我们来更改自动生成的public/stylesheets/scaffold.css样式表,追加如下:
 
.ListTitle{
   color:#244;
   font-weight:bold;
   font-size:larger;
}
.ListActions{
   font-size:x-small;
   text-align:right;
   padding-left:lem;
}
.ListLine0{
   background:#e0f8f8;
}
.ListLine1{
   background:#f8b0f8;
}
最后我们把一些图片放进public/images目录下,再输入一些货品描述。
Rails脚手架提供了完整的源代码,你可以修改这些文件,并且立即可以看到结果。这样的我们就可以用一种敏捷的方式进行开发。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值