发新话题
打印

[项目推荐] 一个学习RoR中REST的好范例beast

本主题由 admin 于 2008-6-1 21:14 分类

一个学习RoR中REST的好范例beast

今天发现这个forum的实现基本上使用了RESTful风格。粗看了一下代码,感觉对学习REST有一些帮助,

网址:

http://beast.caboo.se/

源码:

http://svn.techno-weenie.net/projects/beast/trunk/



安装说明:
http://beast.caboo.se/forums/1/topics/381



调用beast.caboo.se 的REST服务的说明:

http://weblog.techno-weenie.net/ ... ut-for-a-test-drive

可以使用curl工具来测试。(一个测试的说明文档)

http://blog.inquirylabs.com/2006 ... test-restful-rails/

我对REST的理解:REST简化了不同应用(系统)之间的互操作性。而RoR的REST实现则更加简练,更简单,如果几个系统都采用RoR开发(最新的1.2版),系统之间要实现互操作是很简单的。

杂谈:我一直以来个人认为互联网上的url广义的看就相当于一般的C,C++,.JAVA中的函数,而传递给url的参数(?pramA=a&pramB=b),就相当于函数的参数,如果要实现回调,则把一个url当作参数传递过去就好了,当然url上“函数签名(或者叫约定)”远没有本地函数调用那么“安全”,回调方必须了解回调url的约定。rails以前的版本在url中隐含了一些参数信息(/controller/show/1),并且rails内定了不少函数签名规则。而Rails1.2的REST则在HTTP协议的Header中隐含了一些参数或者说语义(POST,GET,PUT,DELETE)。Rails1.2的REST实现 替程序员作了很多工作,使得调用url"函数" 就像调用本地函数一样方便。


http://blog.aisleten.com/2007/07 ... n-rails-app-part-1/


rake db:schema:load RAILS_ENV=production

ruby script/server -e production


beast1.0 解读
http://czy0203.javaeye.com/blog/111267


Globalize
http://www.javaeye.com/topic/29540


阅读beast day by day
http://www.javaeye.com/topic/78885



中文化:

Copy lang/en.yml to lang/xx.yml where xx is your language code
Translate all strings in xx.yml
Put Gibberish.current_language = :xx at the end of your config/environment.rb file
离开毛茸茸的状态,死挺,成为社会中坚。

TOP

离开毛茸茸的状态,死挺,成为社会中坚。

TOP

1. 使用下面命令checkout 最新的代码:
svn checkout http://svn.techno-weenie.net/projects/beast/trunk/

关于 svn, 可以去 www.subversion.org 下载安装

2. 执行以下任务:
rake freeze_edge
rake rails:freeze:edge
rake rails:freeze:gems

3. 安装以下插件:
gem install RedCloth -y
gem install gettext -y
gem install ruby-openid -y

4. 修改 database.yml (把 database_example.yml 改成 database.yml)

默认的dev 环境是用 SQLite,可以不装这个,把 SQLite的注释掉,
直接用mysql的,例如:

development:
  database: beast_prod
  adapter: mysql
  host: 127.0.0.1
  username: root
  password: 123

....省略

5. 执行 rake db:schema:load

6. ruby script/server, 测试一下吧!

production:
  database: beast_prod
  adapter: mysql
  host: 127.0.0.1
  username: root
  password: 123
离开毛茸茸的状态,死挺,成为社会中坚。

TOP

Fedora Core 6 上安裝 beast

我選擇 apache2.2 + mongrel_cluster + postgresql

安裝 apache 和其他的東西。
sudo yum install httpd
sudo yum install httpd-devel
sudo yum install openssl
sudo yum install readline

安裝 ruby
sudo yum install ruby
sudo yum install ruby-devel
sudo yum install ruby-libs
sudo yum install rdoc
sudo yum install irb

安裝 postgresql
sudo yum install postgresql
sudo yum install postgresql-devel
sudo yum install postgresql-libs
sudo yum install postgresql-server

初始化 postgres
sudo mkdir -p /var/db/postgresql81/defaultdb
sudo chown postgres:postgres /var/db/postgresql81/defaultdb
sudo -u postgres initdb -D /var/db/postgresql81/defaultdb
sudo -u postgres pg_ctl -D /var/db/postgresql81/defaultdb \
-l /var/db/postgresql81/defaultdb/postgres.log start

拿來抓 beast... 捨 svn 取 svk 因為我討厭一堆 .svn
sudo yum install perl-SVK

sudo yum install rubygems

至少要用這些 gem
sudo gem install rails -y
sudo gem install mongrel_cluster -y
sudo gem install redcloth -y
sudo gem install ruby-openid -y
sudo gem install ruby-postgres -y

建立目錄。
mkdir -p ~/projects/beast
cd ~/projects/beast

用 svk 抓不會有一堆 .svn 礙眼。
svk mirror //mirror/beast \
http://svn.techno-weenie.net/projects/beast/branches/stable-1.0/
svk sync -s HEAD //mirror/beast
cd stable-1.0

產生讓 beast 用的資料庫。
sudo -u postgres createdb beast_prod

設定資料庫設定檔。
cp config/database.example.yml config/database.yml

nano config/database.yml
=========================
production:
  database: beast_prod
  adapter: postgresql
  host: localhost
  username: postgres
  password:
=========================

初始化 beast 資料庫。
rake db:schema:load RAILS_ENV=production

非常囉唆的 cluster 設定,user 可以開 mongrel,
不過因為我懶所以用自己的帳號跑。
sudo mongrel_rails cluster::configure -e production \
-p 2000 -N 3 -c /home/YOUR_NAME/projects/beast/stable-1.0 \
-a 127.0.0.1 --user YOUR_NAME --group YOUR_NAME

啟動 mongrel_cluster 吧。
sudo mongrel_rails cluster::start

接著是 apache2.2 的 mod_proxy_balancer 的設定,
如果 mod_proxy_balancer 沒有啟動記得把他打開。

建立 balancer 導向 port 2000~2002
编辑 /etc/httpd/conf/httpd.conf
复制内容到剪贴板
代码:
<Proxy balancer://YOUR_BALANCER>
  BalancerMember http://YOUR_ADDRESS:2000
  BalancerMember http://YOUR_ADDRESS:2001
  BalancerMember http://YOUR_ADDRESS:2002
</Proxy>

Listen 80
<VirtualHost *:80>
  ServerAdmin YOUR_EMAIL
  ServerName YOUR_ADDRESS
  ProxyPass / balancer://YOUR_BALANCER/
  ProxyPassReverse / balancer://YOUR_BALANCER/
  ProxyPreserveHost on
  ErrorLog /home/YOUR_NAME/projects/beast/stable-1.0/log/apache_error.log
  CustomLog /home/YOUR_NAME/projects/beast/stable-1.0/log/apache_access.log combined

  ProxyPass /images !
  ProxyPass /stylesheets !
  ProxyPass /javascripts !
  Alias /images /home/YOUR_NAME/projects/beast/stable-1.0/public/images
  Alias /stylesheets /home/YOUR_NAME/projects/beast/stable-1.0/public/stylesheets
  Alias /javascripts /home/YOUR_NAME/projects/beast/stable-1.0/public/javascripts
</VirtualHost>
接著啟動 apache 就 ok 了。
sudo apachectl start

最後來設定 beast 的 smtp, 如果想用 gmail 寄信的話,
我之前試過兩個方式,一個是使用 msmtp,
另一個是有人有寫一小段 ssl smtp 的 patch, 可以參考這裡:
http://www.stephenchu.com/2006/0 ... server-to-send.html

编辑 config/environment.rb
加入:
复制内容到剪贴板
代码:
ActionMailer::Base.smtp_settings = {
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => 'YOUR_DOMAIN',
  :user_name => "YOUR_GMAIL_ACCOUNT",
  :password => 'YOUR_GMAIL_PASSWORD',
  :authentication => :plain
}
编辑 app/models/user_mailer.rb
复制内容到剪贴板
代码:
@from = 'YOUR_GMAIL_ACCOUNT@gmail.com'
我不是很確定這一步要不要做,我猜不做會被 gamil 擋掉。

接下來把那段程式碼 copy 到可以被 require 的地方,我是放在 lib 下:
lib/smtp_tls.rb
复制内容到剪贴板
代码:
require "openssl"
require "net/smtp"

Net::SMTP.class_eval do
  private
  def do_start(helodomain, user, secret, authtype)
    raise IOError, 'SMTP session already started' if @started
    check_auth_args user, secret, authtype if user or secret

    sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
    @socket = Net::InternetMessageIO.new(sock)
    @socket.read_timeout = 60 #@read_timeout
    @socket.debug_output = STDERR #@debug_output

    check_response(critical { recv_response() })
    do_helo(helodomain)

    raise 'openssl library not installed' unless defined?(OpenSSL)
    starttls
    ssl = OpenSSL::SSL::SSLSocket.new(sock)
    ssl.sync_close = true
    ssl.connect
    @socket = Net::InternetMessageIO.new(ssl)
    @socket.read_timeout = 60 #@read_timeout
    @socket.debug_output = STDERR #@debug_output
    do_helo(helodomain)

    authenticate user, secret, authtype if user
    @started = true
  ensure
    unless @started
      # authentication failed, cancel connection.
        @socket.close if not @started and @socket and not @socket.closed?
      @socket = nil
    end
  end

  def do_helo(helodomain)
     begin
      if @esmtp
        ehlo helodomain
      else
        helo helodomain
      end
    rescue Net::ProtocolError
      if @esmtp
        @esmtp = false
        @error_occured = false
        retry
      end
      raise
    end
  end

  def starttls
    getok('STARTTLS')
  end
end
接著把他 require 進去:
编辑config/environment.rb
复制内容到剪贴板
代码:
require 'smtp_tls'
参照:
http://d.hatena.ne.jp/zorio/20060416
http://d.hatena.ne.jp/zorio/20060417
http://www.puni.net/~mimori/rfc/rfc2821b.txt

TOP

http://github.com/courtenay/altered_beast/tree/master


Copy lang/en.yml to lang/xx.yml where xx is your language code
Translate all strings in xx.yml
Put Gibberish.current_language = :xx at the end of your config/environment.rb file

TOP

支持rails2.0的版本

1.svn checkout http://svn.techno-weenie.net/projects/beast/trunk/
2.environment.rb 注释掉这行#config.active_record.whiny_protected_attributes = false
3.gem install RedCloth
4.修改数据库配置文件'database.yml'.
5.全文检索 require_gem ->gem
5.rake db:schema:load

TOP

发新话题