Passenger新版本request_uri header自动转码的问题

Posted by HoLin on January 21st, 2010 filed in 部署与优化
Comment now »

Nginx access.log :

127.0.0.1 - - [21/Jan/2010:21:13:58 +0800] “GET /notes/Books+%2B+Online+Video+%3D+Vooks%3A+Watchable%2C+Readable%2C+%26+Very+Cool HTTP/1.1″ 304 0 “-” “Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7″

到Rails之后log/production.log:

Completed in 123ms (View: 8, DB: 62) | 200 OK [http://i/notes/Books+++Online+Video+=+Vooks:+Watchable,+Readable,+&+Very+Cool]

url被自动decode了,在我们的项目中并不想要这样的结果。

网上查了很多资料,Apache版本有类似 AllowEncodedSlashes 的指令。Nginx暂时没有。

对比了passenger-2.2.4和passenger-2.2.9,在文件ext/nginx/Configuration.c中有一行代码和这个相关。
2.2.9:

DEFINE_VAR_TO_PASS(”REQUEST_URI”, “$uri$is_args$args”);

2.2.4

DEFINE_VAR_TO_PASS(”REQUEST_URI”, “$request_uri”);

用2.2.4的替换2.2.9的,重新编译就可以了。


Nagios中用飞信发送报警信息

Posted by devon on December 4th, 2009 filed in 部署与优化
Comment now »

近期由于飞信的API变更,原先的Linux版本fetion程序不能再用来发送信息了。而由 flyerhzm 开发的rfetion更新较快,可用来配合Nagios的报警信息发送。

rfetion是基于ruby的一个飞信客户端工具,有命令行的发送模式。使用前,需事先安装好 ruby,及rubygem,相关安装过程在网上有很多。

安装好ruby及rubygem后,可通过如下两行命令来安装rfetion:

1
2
gem sources -a http://gemcutter.org
sudo gem install rfetion

在nagios中增加用飞信发送报警信息的命令。需要注意的是rfetion可执行文件的路径/usr/local/ruby/bin/rfetion在不同平台可能会稍有区别,请根据自己的实际情况处理。同时,命令中的手机号与密码需要修改为对应的用于发送通知的飞信手机号码与密码。

1
2
3
4
5
6
7
8
9
define command {
  	command_name     host-notify-by-sms
  	command_line     /usr/local/ruby/bin/rfetion --silence -m 18888888888 -p my_password -f $CONTACTPAGER$ -c "Host $HOSTSTATE$ alert for $HOSTNAME$! on $SHORTDATETIME$"
}
 
define command {
  	command_name     service-notify-by-sms
  	command_line     /usr/local/ruby/bin/rfetion --silence -m 18888888888 -p my_password -f $CONTACTPAGER$ -c "'$HOSTADDRESS$' $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ on $SHORTDATETIME$"
}

在对应的的contact定义里,定义报警信息发送使用service-notify-by-sms、host-notify-by-sms,并在pager一行中写入待通知的手机号码。

1
2
3
4
5
6
7
8
9
10
define contact{
        contact_name    henry
        use             generic-contact
        alias           heyry
        service_notification_commands   service-notify-by-sms
        host_notification_commands      host-notify-by-sms
 
        email           demo@demo.gmail
        pager           18666666666
}

重新加载nagios后,报警信息即可通过飞信来发送。

rfetion还有其它更强大的功能,具体信息可通过 rfetion api and source code


Jquery 表格工具 — 2dc_jqgrid————–

Posted by wosmvp on May 24th, 2009 filed in Plugin, Rails应用, web前端技术, 敏捷开发, 测试方法
Comment now »

它整合了 InPlaceEdit分页搜索,添加,删除等功能,甚至还可以处理附属关系的表格

功能不可谓不强大,但代码却是来的简单的很!

————————–

- Ajax enabled
- Sorting
- Pagination
- Search
- CRUD operations (add, edit, delete)
- Multi-selection (checkboxes)
- Master-details
- Themes
- And more ...
--------------

The jQuery grid plugin is an amazing Javascript project providing multi-functions Ajax datagrids for your web applications.简而言之,居家旅行杀人放火逃命跳墙之必备良品!

在官方文档面前,任何其它文档都是失色的 http://www.2dconcept.com/jquery-grid-rails-plugin

在这里就不无聊的敷述一下过程了

简单的谈几其它个问题:

1,它的例子代码太“重量级”:

针对它第一个例子方法的优化:

原方法:

users = User.find(:all) do
    if params[:_search] == "true"
      pseudo    =~ "%#{params[:pseudo]}%" if params[:pseudo].present?
      firstname =~ "%#{params[:firstname]}%" if params[:firstname].present?
      lastname  =~ "%#{params[:lastname]}%" if params[:lastname].present?
      email     =~ "%#{params[:email]}%" if params[:email].present?
      role      =~ "%#{params[:role]}%" if params[:role].present?
    end
    paginate :page => params[:page], :per_page => params[:rows]
    order_by "#{params[:sidx]} #{params[:sord]}"
  end

修改后:

users = User.find(:all) do |x|
    if params[:_search] == "true"
       [:pseudo,:firstname,:lastname,:email,:role].map do |m|
           x.send(m) =~ "%#{params[m]}" if params[m].presend?
       end
    end
    paginate :page => params[:page], :per_page => params[:rows]
    order_by "#{params[:sidx]} #{params[:sord]}"
end

2, 第二个问题就是如果你上面的order_by排序排字字段使用了SQL的关键字会出现问题的!
上解决方案:
order_by “`#{params[:sidx]}` #{params[:sord]}” if
!params[:sidx].blank?

3,上我自己做的中文翻译 :) 点击下载
你需要修改javascripts/jqgrid/jquery.jqGrid.js第10行附近来使用此中文翻译

并且我还修改了源码 vendor/plugins/2dc_jqgrid/lib/2dc_jqgrid.rb第233行,将其中的caption “Search” 修改为“搜索”
(PS:我知道偷偷修改源码,这是很不好的的做法,那怕是字符串的修改,但实在没有找到更优雅一点的办法,有时间再深入它的源码看看吧 :)


Nginx + Passenger 开发Rails应用

Posted by devon on May 22nd, 2009 filed in Rails应用
2 Comments »

在Rails开发过程中,如果同时开发多个项目,需要经常切换,使用 script/server 去启动应用会比较麻烦,而采用nginx(或apache) + passenger可以节约时间,提高效率。

1、安装passenger
下载Passenger,目前最新的版本为2.2.2,并解压到passenger的安装目录:

1
2
tar xzvf passenger-2.2.2.tar.gz /usr/local/passenger
./passenger-2.2.2/bin/passenger-install-nginx-module

按提示操作安装nginx与passenger。

也可以通过gem方式来安装:

1
2
gem install passenger
passenger-install-nginx-module

2、配置nginx
/usr/local/nginx/conf/nginx.conf,在http段加上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http{
	...
	passenger_root /usr/local/passenger;
	passenger_ruby /usr/local/bin/ruby;
 
	server {
		listen 80;
		server_name app1;
		root /Users/jack/app1/public;
		passenger_enabled on;
		rails_env development;
   	}
 
	server {
		listen 80;
		server_name app2;
		root /Users/jack/app2/public;
		passenger_enabled on;
		rails_env development;
   	}
	...
}

3、启动与停止nginx的命令

假设nginx安装在/usr/local/nginx目录里。将如下命令加到~/.bashrc(linux)、 ~/.bash_profile(Mac)

1
2
3
alias sn='sudo /usr/local/nginx/sbin/nginx' 
alias kn='sudo kill `cat /usr/local/nginx/logs/nginx.pid `' 
alias rn='kn; sn'

4、增加应用的host到/etc/hosts,如:

1
2
127.0.0.1 app1
127.0.0.1 app2

这样,在开发时,可以在浏览器中,直接用app1, app2去访问各个应用,再也不用去script/server之类的了。


Leopard为不同的应用程序保留输入法状态

Posted by devon on February 11th, 2009 filed in Uncategorized
1 Comment »

Mac 10.5(Leopard)去掉了为单独窗口设置单独输入法的选项,取而代之的是全局输入法,需要不停的切换切换切换,很不方便。(这个功能在tiger上还可以使用的)

用inputswitcher可以替换的实现这个功能。步骤为:

  1. 下载并安装 SIMBL
  2. 下载 inputswitcher , 并解压
  3. InputSwitcher.app → /Applications
  4. InputSwitcherClient.bundle → /Library/Application Support/SIMBL/Plugins
  5. 启动InputSwitcher.app,并重启其它应用程序,就可以为不同的应用程序窗口保留输入法状态了。

参考:http://limechat.net/inputswitcher/


ruby on rails dictionary for macosx

Posted by devon on February 8th, 2009 filed in Plugin
Comment now »

在Dictionary中搜索API。

使用方法:

  • 下载文档
  • 解压至~/Library/Dictionaries/ 或 /Library/Dictionaries/
  • 打开Dictionary → Preferences, 选中ruby, 并拖至最顶点,这样,就可以spotlight来搜索API了。


Satellite: a self-syncing distributed wiki

Posted by HoLin on January 22nd, 2009 filed in Ruby应用
Comment now »

介绍

satellite is a self-syncing distributed wiki with file uploads and all sorts of other useful features like offline editing.

主要的特性有:

  • textile的wiki语法
  • 支持文件上传
  • 所有文档基于git存储与管理
  • 离线编辑,并可自动同步到服务器
  • 支持代码高亮
  • 全面快捷键支持

经我们测试,用于个人知识管理,非常棒。

安装

  • 安装 Git! (and Ruby)
  • 获取代码,原始代码在”这里”:http://github.com/kenpratt/satellite/tree/master ,我们fork出了一个版本(http://github.com/holin/satellite/tree/master),根据中文环境和自己的实际需求增加了一些功能,具体看 satellit扩展功能
1
$ git clone git@github.com:holin/satellite.git satellite
  • 安装gems, {color:red}注意 ,rack要求使用0.4版本(其它版本未完整测试,最新的0.9rack不能用)
1
2
3
4
$ sudo gem install rack mongrel metaid erubis RedCloth coderay
 $ cd path/to/satellite
 $ git submodule init
 $ git submodule update
  • 配置应用,下方其他中有公开git repository申请说明
1
cd path/to/satellite
  • edit conf/production.rb
  • production.rb example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# production configuration
 
# URI of master git repository for wiki content
config.master_repository_uri = 'git+ssh://repo.or.cz/srv/git/pkmh.git'
 
# user information to use for git content submissions
config.user_name = 'holin'
config.user_email = 'holin@example.com'
 
# logging level (:error, :warn, :info, :debug)
config.log_level = :warn
 
# automatically reload app when app files change? (for development)
config.auto_reload = true
  • 启动server
1
2
3
$ bin/start_satellite  
** Starting Satellite_2
** Satellite_2 is now running at http://0.0.0.0:4000/
  • 访问http://localhost:4000/

配置文件,initialize中的配置都可以在production.rb里面通过config.xxx = ??? 来配置

  • lib/configration.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def initialize
    # defaults values
    self.app_name               = 'Satellite'
    self.server_ip              = '0.0.0.0'
    self.server_port            = 7000
    self.master_repository_uri  = ''
    self.user_name              = ''
    self.user_email             = ''
    self.sync_frequency         = 60
    self.app_dir                = File.join(File.dirname(File.expand_path(__FILE__)), '../')
    self.conf_dir               = File.join(app_dir, 'conf')
    self.template_dir           = File.join(app_dir, 'templates')
    self.static_dir             = File.join(app_dir, 'static')
    self.log_dir                = File.join(app_dir, 'log')
    self.data_dir               = File.join(app_dir, 'data')
    self.log_level              = :info
    self.log_file_name          = 'app.log'
    self.auto_reload            = false
    self.prettify_exceptions    = true
    self.max_upload_filesize    = 200
    self.authentication         = false
    self.authenticator          = nil
  end

Mac下配置开机启动

  • 下载 Lingon
  • 写启动server脚本satellite.sh
1
2
3
4
5
#!/bin/sh
 
export PATH=/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:/Applications/:$PATH
 
cd /Users/devon/wiki && bin/start_satellite
  • 运行Lingon,配置User Deamon
  • 注销,并重新登录。测试是否正确配置

其他


shoulda on rails

Posted by HoLin on January 7th, 2009 filed in Rails应用, 敏捷开发, 测试方法
2 Comments »

在新项目中配置shoulda

1
2
3
4
5
6
7
rails shoulda_demo -d mysql
cd shoulda_demo/
 
script/plugin install git://github.com/thoughtbot/shoulda.git
sudo gem install thoughtbot-factory_girl --source http://gems.github.com
script/plugin install git://github.com/technicalpickles/factory_girl_on_rails.git
script/plugin install git://github.com/hardbap/coulda.git

测试model

生成model

1
script/generate coulda_model subject

写测试代码,编辑文件 test/unit/subject_test.rb

1
2
3
4
5
6
require File.dirname(__FILE__) + '/../test_helper'
 
class SubjectTest < ActiveSupport::TestCase
  should_have_many :questions
  should_require_attributes :name
end

运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/subject_test.rb" "test/unit/user_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
FF.............
Finished in 0.301899 seconds.
 
  1) Failure:
test: Subject should have many questions. (SubjectTest)
    ...:
Subject does not have any relationship to questions.
<nil> is not true.
 
  2) Failure:
test: Subject should require name to be set. (SubjectTest)
    ...:
Subject allowed nil as a value for name.
<false> is not true.
 
15 tests, 28 assertions, 2 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.434793 seconds.
 
15 tests, 27 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb"  
Errors running test:units!

出错,编辑文件 app/models/subject.rb 来让测试通过

1
2
3
4
class Subject < ActiveRecord::Base
  has_many :questions
  validates_presence_of :name
end

再次运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/subject_test.rb" "test/unit/user_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
E..............
Finished in 0.333493 seconds.
 
  1) Error:
test: Subject should have many questions. (SubjectTest):
NameError: uninitialized constant Question
    ...
 
15 tests, 31 assertions, 0 failures, 1 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.460992 seconds.
 
15 tests, 27 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb"  
Errors running test:units!

还是通不过,新建question model

1
2
3
4
5
6
7
8
9
HoLin:tiku holin$ script/generate coulda_model question
      exists  app/models/
      exists  test/unit/
      exists  test/factories/
      create  app/models/question.rb
      create  test/unit/question_test.rb
      create  test/factories/question_factory.rb
      exists  db/migrate
      create  db/migrate/20090107064242_create_questions.rb

运行测试

1
2
3
4
5
HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
You have 1 pending migrations:
  20090107064242 CreateQuestions
Run "rake db:migrate" to update your database then try again.

需要先完成所有的Migration,那就完成他们吧。

1
2
3
4
5
6
HoLin:tiku holin$ rake db:migrate
(in /Users/holin/work/kuxuesoft/tiku)
==  CreateQuestions: migrating ================================================
-- create_table(:questions)
   -> 0.0347s
==  CreateQuestions: migrated (0.0351s) =======================================

再运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/question_test.rb" "test/unit/subject_test.rb" "test/unit/user_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.323642 seconds.
 
15 tests, 32 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.438684 seconds.
 
15 tests, 27 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb"

通过测试

测试controller

生成controller

1
2
3
4
5
6
7
8
HoLin:tiku holin$ script/generate controller subjects
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/subjects
      exists  test/functional/
      create  app/controllers/subjects_controller.rb
      create  test/functional/subjects_controller_test.rb
      create  app/helpers/subjects_helper.rb

编写测试代码,编辑文件test/functional/subjects_controller_test.rb

1
2
3
4
5
6
7
8
9
10
require 'test_helper'
 
class SubjectsControllerTest < ActionController::TestCase
 
  context "on POST to :create" do
    setup { post :create, :subject => {:name => 'CET-6', :desc => 'description goes here' } }
    should_assign_to :subject
    should_redirect_to "subject_url(@subject)" 
  end
end

运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
..........FE.....
Finished in 0.603312 seconds.
 
  1) Failure:
test: on POST to :create should assign @subject. (SubjectsControllerTest)
    [...]:
The action isn't assigning to @subject.
<nil> expected to not be nil.
 
  2) Error:
test: on POST to :create should redirect to "subject_url(@subject)". (SubjectsControllerTest):
NoMethodError: undefined method `subject_url' for #<SubjectsControllerTest:0x227f428>
    ...
 
17 tests, 28 assertions, 1 failures, 1 errors
rake aborted!
Command failed with status (1): [/usr/local/bin/ruby -Ilib:test "/usr/local...]
 
(See full trace by running task with --trace)

添加routes

1
map.resources :subjects

运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
..........FE.....
Finished in 0.536594 seconds.
 
  1) Failure:
test: on POST to :create should assign @subject. (SubjectsControllerTest)
    [...]:
The action isn't assigning to @subject.
<nil> expected to not be nil.
 
  2) Error:
test: on POST to :create should redirect to "subject_url(@subject)". (SubjectsControllerTest):
ActionController::RoutingError: subject_url failed to generate from {:controller=>"subjects", :action=>"show", :id=>nil}, expected: {:controller=>"subjects", :action=>"show"}, diff: {:id=>nil}
    ...
 
17 tests, 28 assertions, 1 failures, 1 errors
rake aborted!
Command failed with status (1): [/usr/local/bin/ruby -Ilib:test "/usr/local...]
 
(See full trace by running task with --trace)

编辑app/controllers/subjects_controller.rb, 增加create action

1
2
3
4
5
6
7
8
9
10
11
12
13
class SubjectsController < ApplicationController
 
  def create
    @subject = Subject.new(params[:subject])
    if @subject.valid? && @subject.save
      flash[:message] = "添加成功"
      redirect_to subject_url(@subject)
    else
      render :action => 'new'
    end
  end
 
end

运行测试

1
2
3
4
5
6
7
8
9
HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
.................
Finished in 0.687698 seconds.
 
17 tests, 29 assertions, 0 failures, 0 errors

测试通过

测试需要登陆的操作、嵌套context

编写测试代码,编辑文件test/functional/subjects_controller_test.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
require 'test_helper'
 
class SubjectsControllerTest < ActionController::TestCase
 
  context "do these after logged in" do
 
    setup {
      @request.session[:user_id] = User.first.id
    }
 
    context "on POST to :create" do
      setup { 
        post :create, :subject => {:name => 'CET-6', :desc => 'description goes here' } 
      }
      should_assign_to :subject
      should_redirect_to "subject_url(@subject)"
    end
 
    context "on POST to :create without subject name" do
      setup { 
        post :create, :subject => {:desc => 'description goes here' } 
      }
      should_assign_to :subject
      should_redirect_to "new_subject_url"
    end
 
  end
end

运行测试

1
2
3
4
5
6
7
8
9
HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...................
Finished in 0.572731 seconds.
 
19 tests, 31 assertions, 0 failures, 0 errors

参考资源


Git服务器安装

Posted by devon on January 6th, 2009 filed in 源代码管理
Comment now »

Git on Ubuntu Server

安装Git-Core:

1
2
3
4
sudo apt-get update # 可选步骤
sudo apt-get dist-upgrade # 可选步骤
 
sudo apt-get install git-core

因为要用到 Gitosis ,所有,需要安装python setuptools

1
sudo apt-get install python-setuptools

安装 Gitosis

1
2
3
4
5
6
mkdir ~/src
cd ~/src
git clone git://eagain.net/gitosis
 
cd gitosis
sudo python setup.py install

增加名为Git的用户

1
sudo adduser --system --shell /bin/sh  --gecos 'git version control' --group --disabled-password --home /home/git git

上传公钥到USER用户的根目录下(如果没有,用 ssh-keygen -t rsa 生成)

1
2
3
scp .ssh/id_rsa.pub USER@YOUR_SERVER:
sudo -H -u git gitosis-init < /home/USER/id_rsa.pub
sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

到这一步,基本上都安装好了,到本地进行测试:

1
git clone git@YOUR_SERVER:gitosis-admin.git

成功后,在本地将有一个gitosis-admin目录,里面有gitosis.conf,keydir。

为Rails项目配置git
打开gitosis.conf,增加一块内容,members为某个用户的公钥~/.ssh/id_rsa.pub中的名字(在该文件的最后在)

1
2
3
[group myrailsapp]
members = vince@urbanpuddle
writable = myrailsapp

然后,提交修改

1
2
git commit -a -m "created a new repository"
git push

将本地代码提交到git中

1
2
cd myrailsapp
git init

创建 .gitignore 文件,用于忽略某些不需要进行代码管理的内容

1
2
3
4
5
.DS_Store
log/*.log
tmp/**/*
config/database.yml
db/*.sqlite3

提交代码

1
2
3
4
git remote add origin git@YOUR_SERVER:myrailsapp.git
git add .
git commit -a -m "initial import"
git push origin master:refs/heads/master

接下来,可以增加成员的公钥到系统中了

1
2
3
4
cd gitosis-admin
cp ~/alice.pub keydir/
cp ~/bob.pub keydir/
git add keydir/alice.pub keydir/bob.pub

修改gitosis.conf

1
2
3
4
[group myteam]
- members = jdoe
+ members = jdoe alice bob
  writable = free_monkey

提交修改

1
2
git commit -a -m "Granted Alice and Bob commit rights to FreeMonkey"
git push

其它成员就可以获取代码了

1
git clone git@YOUR_SERVER:myrailsapp.git

请参考 Hosting Git repositories, The Easy (and Secure) Way

原文请参考 : http://enjoyrails.com/wikis/Git安装


Rails中检测SWF尺寸

Posted by devon on January 5th, 2009 filed in Rails应用
Comment now »

安装:

1
2
cd vendor/plugins
svn export http://ruby-imagespec.googlecode.com/svn/trunk/ image_spec

使用:

1
2
3
4
image = ImageSpec::Dimensions.new('/path/to/your/file')
 
image.width
image.height

例子:

1
2
3
4
5
6
>> image = ImageSpec::Dimensions.new("#{RAILS_ROOT}/a.swf")
=> #<ImageSpec::Dimensions:0x2570d94 @height=670, @width=868>
>> image.width
=> 868
>> image.height
=> 670