Ruby on rails开发从头来 for dotNETer 系列随笔

Ruby on rails开发从头来 for dotNETer 系列随笔

目录:

关键字:php?name=Ruby" onclick="tagshow(event)" class="t_tag">Ruby On Rails ,InstantRails,Windows,入门,教程

一直想尝试Ruby On Rails,但是因为对apache,mysql都不熟,对Rails的环境搭建更是没信心,所以一直没有开始,从知道了InstantRails后,终于在windows上搭建了Ruby On Rails开发环境,开始了Rails的学习。
现在从最基础的知识开始,一边读着《Agile Web Development with Rails》的英文电子版,一边写随笔,并且尽量写的简单明了些,对于具体的细节概念倒没有做深入的研究,所以,这一系列也是《Agile Web Development with Rails》的读书笔记(其实叫做“抄书笔记”可能更合适)。
之所以做为一个系列,是因为给自己定一个计划,不致半途而废。另外也是为了象我一样不懂Linux开发的dotNETer们查找,参考方便。

Ruby on rails开发从头来(windows)(一)-使用InstantRails快速搭建Ruby On Rails开发环境

Ruby on rails开发从头来(windows)(二)-创建项目和第一个Hello world

Ruby on rails开发从头来(windows)(三)-实现页面间的跳转

Ruby on rails开发从头来(windows)(四)-第一个添删查改例子

Ruby on rails开发从头来(windows)(五)-对输入进行验证

Ruby on rails开发从头来(windows)(六)-美化你的列表页面

本文转摘自:http://www.cnblogs.com/dahuzizyd ... ails_study_All.html
一直对Ruby on Rails抱有很大的兴趣,想看看这个被很多人称道的东西,但是一直在做windows下的开发,对于Ruby on Rails的开发环境搭建还是很头疼,这也是一直没有开始研究Ruby on rails的原因。刚刚在javaeye看到了InstantRails,一个All In One的套件,可以帮助你快速搭建Ruby On Rails开发环境,就立即下了一个试了试,还好,比较顺,起码可以跑起来自带的例子了。下面就把简单写写使用InstantRails快速搭建一个Ruby on Rails开发环境。

1.
下载InstantRails:
下载地址:http://rubyforge.org/frs/?group_id=904,我下载的是最新的1.7版本的。
2.
在本地解压缩InstantRails-1.7-win.zip,完成后运行InstantRails.exe程序。

刚运行起来,因为要启动mysql和apache,可能会提示80端口被占用,



这时需要修改apache的配置文件,把其中的80端口相关的设置改掉,例如81。在这里,你只要搜索,替换就可以了。
完成后重新启动apache,完成后,应该类似于出现下图的画面:


这时,你就可以开始运行实例了。
3.
从最左侧的图标开始,运行菜单的Rails Applications\Manage Rails applications,将会出现下面的界面:


在这里我们选中typo-2.6.0,并点击start with Mongrel按钮,等到在弹出的命令行窗口中显示“Use CTRL+C to Stop”的提示时,你就可以运行例子程序了。
4.
在浏览器中输入地址:http://127.0.0.1:3002,例子就运行起来了,是一个blog程序。经过创建用户,设置后,你就可以浏览到首页了,如图:




很简单吧,因为搭建Ruby on Rails开发环境而驻足不前的朋友快试试吧。
这一次说说如何创建自己的项目,并写一个最简单的Hello页面,例子是借用Agile Web Development with Rails中的。按照下面的步骤:
1.
使用菜单,如下图:

2.
点击“Create New Rails App…”按钮,如下图

3.
在弹出的命令行窗口中输入:rails YourApplicationName,这里是myfirst,然后你会看到
create
create
app/controllers
create
app/helpers
create
app/models
create
app/views/layouts
create
config/environments
create
components
……
create
db
create
doc
create
lib
create
lib/tasks
create
log
……
create
public/javascripts/dragdrop.js
create
public/javascripts/controls.js
create
public/javascripts/application.js
create
doc/README_FOR_APP
create
log/server.log
create
log/production.log
create
log/development.log
create
log/test.log
这是Rails在生成目录结构。
4.
在InstantRails中刷新项目列表,会看到刚刚生成的项目,在这里是myfirst,选中项目,并使用“start with Mongrel”启动,这时会看到下图:
5.
完成后在浏览器中输入地址http://127.0.0.1:3000,就可以看到刚才创建的项目,是一个Rails的页面,如图:


上面的步骤完成了一个项目的创建,下面我们来给它添加一些自己的东西,
1.
在Rails的命令行窗口中,定位到刚才创建的项目的目录下:cd myfirst,然后执行命令ruby script/generate controller Say,你会看到下面的输出,
E:\CodeSample\ruby\InstantRails-1.7-win\InstantRails\rails_apps\myfirst>ruby scr
ipt/generate controller Say

exists
app/controllers/

exists
app/helpers/

create
app/views/say

exists
test/functional/

create
app/controllers/say_controller.rb

create
test/functional/say_controller_test.rb

create
app/helpers/say_helper.rb
2.
在上面的目录里可以看到新生成的文件,这时,say_controller.rb文件的内容为:
class SayController < ApplicationController
end
3.
把say_controller.rb文件的内容修改为:
class SayController < ApplicationController

def Hello

end
end
4.
在app\Views\say\目录下创建一个文件hello.rhtml,看文件名就知道了,这个是页面文件,现在让这个文件的内容为:
<html>
<head>
<title>Hello, Rails!</title>
</head>
<body>
<h1>Hello from Rails!</h1>
</body>
</html>
5.
这时再在浏览器中输入地址:http://127.0.0.1:3000/Say/Hello,之后会看到一个页面,如下图:




OK,今天就先到这里,现在还只是知其然不知其所以然,希望后面有精力深入研究下去。
今天在上次的基础上,写一个简单的页面跳转。

1.   将app\controllers目录下的say_controller.rb文件的内容改成下面这样:

class SayController < ApplicationController

   def Hello

       @time = Time.now

   end

   def goodby

   end

end

我们看到和上篇随笔中的内容相比,添加了:

def goodby

end

2.   修改app\views\say目录下的hello.rhtml的内容:

<html>

<p>

Say <a href="/say/goodbye">GoodBye</a>!

</p>

</html>

3.   下面我们要在app\views\say目录下创建一个goodbye.rhtml文件,内容如下:

<html>

<head>

<title>See You Later!</title>

</head>

<body>

<h1>Goodbye!</h1>

<p>

It was nice having you here.

</p>

</body>

</html>

4.   在浏览器地址栏中输入:http://127.0.0.1:3000/say/hello,再试试点链接看看,页面已经可以迁移了。

5.   现在我们再添加由goodbye页面到hello页面的链接,修改goodbye.rhtml的内容为:

<html>

<p>

Say <a href="/say/hello">Hello</a>!

</p>

</html>

再试试看,两个页面已经可以互相跳转了。

6.   在上面的代码中,我们看到页面间的迁移使用的是路径来定位,如果页面存放的位置发生了变化,那么跳转肯定会失败,更安全的是使用下面的方式。

修改hello.rhtml的内容:

<html>

<head>

<title>Hello, Rails!</title>

</head>

<body>

<h1>Hello from Rails!</h1>

<p>

It is now <%= @time %>.

</p>

<p>

Time to say

<%= link_to "GoodBye!", :action => "goodbye" %>

</p>

</body>

</html>



修改goodbye.rhtml的内容:

<html>

<head>

<title>See You Later!</title>

</head>

<body>

<h1>Goodbye!</h1>

<p>

It was nice having you here.

</p>

<p>

Say <%= link_to "Hello", :action=>"hello" %> again.

</p>

</body>

</html>



注意代码里的两句:

<%= link_to "GoodBye!", :action => "goodbye" %>

<%= link_to "Hello", :action=>"hello" %>

可以看到,实际上就是调用了goodbye和hello两个action。


OK,这篇就到这里,先求快速挺进,概念的东西先不追究,希望我能坚持下去。
这次我们来写一个单表维护的添删查改的例子。
1.
这次我们重新创建一个项目depot,按照上篇中的步骤,创建depot项目。
2.
创建数据库。
你可以使用rails的命令行,通过mysql创建,先定位到depot目录,使用命令:

depot> mysql -u root –p

密码为空,连接mysql后执行下面的命令:

mysql> create database depot_development;

mysql> create database depot_test;

mysql> create database depot_production;

mysql> grant all on depot_development.* to 'dave'@'localhost';

mysql> grant all on depot_test.* to 'dave'@'localhost';

mysql> grant all on depot_production.* to 'prod'@'localhost' identified by 'wibble';

mysql> exit

创建数据库完成后,修改depot\config目录下的database.yml文件的内容,将其中development库和test库的username项设置为空。

你也可以用InstantRails中自带的phpmyadmin来创建,PhpMyAdmin的启动可以按照下图:

在这里我们要创建三个数据库depot_development,depot_test,depot_public,这三个库分别用于开发,测试,发布。
3.
在depot项目的db目录下创建一个create.sql文件,内容为:
drop table if exists products;
create table products (
id int not null auto_increment,
title varchar(100) not null,
description text not null,
image_url varchar(200) not null,
price decimal(10,2) not null,
date_available datetime not null,
primary key (id)
);
4.
使用PhpMyAdmin,选择depot_development库,导入上面的脚本,创建Product表。完成后可以看到下图
 
5.
现在万事具备,只欠东风了,下面运行Rails的命令行,如下图:
  
定位到depot目录,执行命令:
ruby script/generate scaffold product Admin,回车,会在命令行窗口输出:


exists
app/controllers/

exists
app/helpers/

exists
app/views/admin

exists
app/views/layouts/

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
overwrite app/views/admin/_form.rhtml? [Ynaqd] a (输出到这里的时候会停一下,输入“a”继续,输出如下)
forcing scaffold

force
app/views/admin/_form.rhtml

identical
app/views/admin/list.rhtml

identical
app/views/admin/show.rhtml

identical
app/views/admin/new.rhtml

identical
app/views/admin/edit.rhtml

identical
app/controllers/admin_controller.rb

identical
test/functional/admin_controller_test.rb

identical
app/helpers/admin_helper.rb

identical
app/views/layouts/admin.rhtml

identical
public/stylesheets/scaffold.css

6.
至此,我们的编码工作就完成了,现在就是试试看你的页面了,在浏览器地址栏中输入:http://127.0.0.1/Admin/New,看到了什么?一个Product表的维护界面,如图:

填入内容后点击Create,会退回到list页面,我们看到Rails把列表,编辑,删除和分页都生成好了,如图:
  
OK,这次就到这里,以前只是听说Rails开发效率如何如何高,现在亲身体验下感觉确实很方便,不知深入下去以后会我的观点会有什么变化。
在上一篇随笔中,我们完成了对一个表Product的添删查改的操作,你一定注意到了,我们还没有添加任何验证,例如Price,我们可以随意输入任何字符,而不会有错误提示。这次,我们就来看看怎样添加验证输入功能。

1.
打开depot\app\models目录下的product.rb文件,向其中添加代码,如下:
class Product < ActiveRecord::Base

validates_presence_of :title, :description, :image_url
end
2.
再次打开http://127.0.0.1:3000/Admin/New,留下title,description,image_url不输入,直接点击Create按钮,会显示错误页面,如下:

3.
上面添加的是必须录入项的验证,下面添加Price项必须为数字的验证。
向Product.rb中添加代码:
validates_numericality_of :price
添加代码后,Product.rb的代码如下:
class Product < ActiveRecord::Base

validates_presence_of :title, :description, :image_url

validates_numericality_of :price
end
4.
再次打开Admin/New页面,给Price项输入字符,点击Create按钮,会看到错误提示,如下图:

5.
下面,我们依次添加验证项,最后Product.rb的内容为:
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, "should be positive") unless price.nil? || price > 0.0

end
end
下面依次解释:
validates_presence_of :title, :description, :image_url :必输入项验证。
validates_numericality_of :price:数值验证
validates_uniqueness_of :title:唯一验证,如果title有重复的,表示error。

validates_format_of :image_url,

:with => %r{^http:.+\.(gif|jpg|png)$}i,

:message => "must be a URL for a GIF, JPG, or PNG image"
对Image_url项验证是否为图片,是否是一个url地址。
protected

def validate

errors.add(:price, "should be positive") unless price.nil? || price > 0.0

end
给price再添加一个验证,看是否为整数。

OK,今天的验证就写到这里。