Rails 的Hello World 之路

按<Agile Web Development with Rails.pdf> 的Hello,Rails样例操作,中间破费周折(比俺想象中要曲折),现贴出我的Rails hello World之路供其他初学rails的朋友参考,如有理解不当的地方也请指出:

开发环境:

1. NetBeans 6.0 (JDK 1.6)
2. ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
3. Rails 2.0.2
4. DB: SQL Server 2000(sp4)


# 未采用generate 脚本工具而是用netbeans调用generate菜单创建Controller
# 因已安装SQL Server所以未使用Rails默认支持的My SQL.

步骤都是按<Agile Web Development with Rails>做的不再赘述,下面主要记录遇到的问题和解决方法,从执行
http://localhost:3000/say/hello 开始:

a.) error 1:
Routing Error

no route found to match "/say/hello" with {:method=>:get}

处理方法摘要:

引用

This is because the Mongrel (and WEBrick for that matter) web server is only capable of handling one application at a time. It needs to be restarted when we switch to another application.

Since we're letting NetBeans start the server, the only way I know to kill it is to kill the ruby.exe process using the Windows Task Manager. Kill ruby.exe, press F6 to run the project, and browse to http://localhost:3000/say/hello.


处理完后, 报错如下:

b.) error 2
Errno::ECONNREFUSED in SayController#hello

不能做任何连接,因为目标机器积极地拒绝它。 - connect(2)
RAILS_ROOT: E:/ruby/xx

- 背景:
a.)Rails提供了很好的My SQL支持,不须做任何配置即可连接.
b.)本机未装My SQL,已装了SQL Server 2000

- 配置Rails 连接SQL Server 2000:

a.) 配置ruby 支持 SQL Server 2000:
a.1) 从http://rubyforge.org/projects/ruby-dbi/下载ruby的DBI包,ruby-dbi.tar.gz, 解压缩以后找到ruby-dbi安装目录下的lib/dbd下的ADO.rb.
a.2) 在ruby安装目录: %ruby_home%/lib/ruby/site_ruby/1.8/DBD 下新建一个ADO文件夹,将ADO.rb文件copy至此目录.
a.3) 测试ruby 连接SQL Server 库(以下代码任意新建一个.rb文件即可测试):

# 连接SQL Server 2000:
require "dbi"
dbh=DBI.connect('DBI:ADO:Provider=SQLOLEDB;Connect Timeout=5;DataSource=localhost;Initial Catalog=pubs;Persist SecurityInfo=True;User ID=sa;Password=;')
sth=dbh.prepare("select * from authors where au_fname like 'S%'")
sth.execute
sth.fetch { |row| p row }


b.) 配置rails 支持SQL Server 2000:

b.1) 修改<rails_app_home>/config/environment.rb 增加:

  require 'win32ole'
  WIN32OLE.codepage = WIN32OLE::CP_UTF8

- 解释:
引用

sql server 2000中使用的unicode 并非是utf8,ado的默认链接编码都是当前系统设置的code pages相关的。

一般的windows设置都是非unicode的,比如简体中文windows系统下一般都是gb2312, 在rails中database.yml设置encoding: utf8,对于sql server没有任何用处。

为了迫使sql server接受utf8数据,必须修改ado链接的code pages值为utf8,才能让ado部分代码在接受rails传入的utf8数据之后,不做任何额外的处理. 否则的话,ado部分代码会根据当前系统的默认code pages值来处理这里字符数据。

于是在中文windows系统上,从utf8的rails项目中传入的数据,会被当作gb2312编码的数据来传递到sql server2000中,于是sql server2000中存入的数据会成为乱码,也有部分数据在处理过程中出错,导致sql 语句执行出错。比如常见的中文字符右边的单引号会不见的情况。

不设置 WIN32OLE.codepage = WIN32OLE::CP_UTF8,你的整个系统编码配置是这样的
rails(utf8)<-->ado(根据当前系统cp来取得编码,或是gb2312或是其他)<-->sql server 2000 (unicode)
整个系统编码是不一致的.

WIN32OLE.codepage = WIN32OLE::CP_UTF8 这句代码就是为了更改cp值.整个系统编码配置是这样的
rails(utf8)<-->ado(utf8)<-->sql server 2000 (unicode)
整个系统编码一至,整个系统中不会再出现任何乱码.


b.2) 用UE 修改<rails_app_home>/config/database.yml (注意: 在windows下用netbeans直接编辑database.yml文件会存在编码的问题)

development:
  adapter: sqlserver
  encoding: utf8
  database: pubs
  username: sa
  password:
  host: localhost

b.3) 刷新: http://localhost:3000/say/hello 仍然报:Errno::ECONNREFUSED in SayController#hello

- 处理:
kill the ruby.exe process using the Windows Task Manager 后再启动WEBrick时报:

=> Booting WEBrick...
E:/Program Files/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:231:in `establish_connection': Please install the sqlserver adapter: `gem install activerecord-sqlserver-adapter` (no such file to load -- active_record/connection_adapters/sqlserver_adapter) (RuntimeError)

- 问题很明显:缺少sqlserver_adapter.rb这个文件.

- 解决:

b.4) 从http://svn.rubyonrails.org/rails/adapters/sqlserver/lib/active_record/connection_adapters/ 下载sqlserver_adapter.rb 然后copy至:
<rails_app_home>\lib\ruby\gems\1.8\gems\activerecord-2.0.1\lib\active_record\connection_adapters


b.5) 刷新: http://localhost:3000/say/hello  => 打印出了: "Hello from Rails".

- 有一点疑惑:
Hello,Rails样例根本不需要数据库支持,为啥非要为Rails配置好数据库连接才能使用?

你可能感兴趣的:(sql,SQL Server,Ruby,Netbeans,Rails)