Rails 大家说说曾遇到过的 rails 的坑与相关 tips 吧

fleuria · 2012年03月22日 · 最后由 zhangyuan 回复于 2012年08月13日 · 4145 次阅读

意料不到的问题总会遇到,记一下的话再掉进同一个坑里就不那么容易了 :D

先抛个砖,都是来自平时记录的一个gist

rvm

before rvm install 1.9.2, make sure

sudo apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

Passenger

passenger-install-apache2-module时出来的提示sudo apt-get install libopenssl-ruby是坑爹的,跟本没有。

解决方法:

rvm remove 1.9.2 rvm pkg install openssl rvm install 1.9.2 --with-openssl-dir=$HOME/.rvm/usr

bundle

bundle install RAILS_ENV=production是个错误的命令,因为 bundle 会把后面的都当成安装 gem 的目标路径,而 bundle 本身并不存在 RAILS_ENV 这回事。它会产生一个名为./RAILS_ENV 的文件夹,并拿它作为以后不 bundle 安装的默认路径。

如果不慎打错了,解决方法:rm .bundle -rf

cd `bundle show rails`可以 cd 到某 gem 所在的目录。

RAILS_ENV

  • rails s -e production;
  • rails c production;
  • rake xxx:run RAILS_ENV=production;

capistrano

对于那种『有可能错误但错了也不碍事』的命令,可以在后面加一个; true,比如

run "kill -QUIT cat #{deploy_to}/shared/pids/unicorn.pid; true"

APP_CONFIG

有时在 application.rb 下加上这一行:

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")

在 production 模式下是有坑的。YAML.load_file的结果是一个字符串为 key 的哈希,如果用 symbol 取东西就会出错(但在 development 模式下一切正常)。解决方法是换成 ActiveSupport 中的HashWithIndifferentAccess

APP_CONFIG = HashWithIndifferentAccess.new YAML.load_file("#{Rails.root}/config/app_config.yml")

Migration

add_column时如果不小心把boolean敲成bool,会把 sqlite 的的db:schema:dump搞坏掉,而 sqlite 并不允许更改 column 的名字。只能用一种蛋疼的work around

Mongodb

ubuntu 源里的mongodb-server是坑爹的,版本太低,正确的是mongodb-10gen,需要加个

Misc

一段小脚本,无关 rails,但可以提升跑 rake task 时的来福值。

** Test ** 某天跑 Test 时相同的代码跑出来的结果不一样,找了半天没发现错误,后来发现测试也开缓存了。

目前遇到最大的坑就是在 before_create 之类的 callback 中无意中返回了 false ....

坑太多了,有些已经忘记了....

rails env 参数确实比较恶心。。。

rails-2.3.5:development 模式下 nil.id 会抛出异常;但是在 production 模式下,返回 4。太极品了。。

#5 楼 @zhangyuan dev 环境配置里有:config.whiny_nils = true 是为了 FailFast。生产环境关闭了是为了性能...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号