「Ruby on Rails」カテゴリーアーカイブ

ActiveRecord::RecordNotSaved - before_save problem

ActiveRecordのクラスで、before_* コールバック がfalseを返すと、以降の処理がキャンセルされてしまうから、saveもされなくなる。
Rubyのメソッドは最後に評価された式が返り値になるから、うっかりコールバックがfalseを返してしまい、saveで変更が保存されず、「どうしてなのか?」とはまることがある。
そういう時は明示的にメソッドを
true
で終わるようにする。
after_* コールバックがfalseを返す場合も、以降のコールバックがキャンセルされてしまう。

If a before_* callback returns false, all the later callbacks and the associated action are cancelled. If an after_* callback returns false, all the later callbacks are cancelled. Callbacks are generally run in the order they are defined, with the exception of callbacks defined as methods on the model, which are called last.

Sketchpad - Dan Sketcher's personal blog » Blog Archive » ActiveRecord::RecordNotSaved - before_save problem

cronでRVMのRubyを使う

現在のRVMでは、以下の方法では、
line 2: rvm: command not found
というエラーになります。
今はもっとよい方法があるので、以下をご覧ください。
cronでRVMのRubyを使う | Memorandum

RVMで複数のRuby環境がある場合に、Railsアプリケーションのためのcronをどうするか? Rubyのパスはフルパス指定すればいいが、gemがRVMのgemを見に行かないのが問題。RVM環境でcronを実行する必要がある。
[1] crontabでrvmのrubyを使う - 橋本詳解
[2] RVM and cron in production
[3] rvm+railsなアプリケーションをcronで動かす - sanojimaru.com
[1]の方法にしてみた。
以下のような感じ。
cron用スクリプト
/home/pistolfly/app_dir/cron/delete_sessions.sh

source /home/pistolfly/.rvm/scripts/rvm
rvm use 1.8.7 > /dev/null
cd /home/pistolfly/app_dir
ruby script/runner -e production "ActiveRecord::SessionStore::Session.delete_all(['sessions.updated_at < ?', 1.day.ago])"

cronの設定

$ crontab -e
*/10 * * * * sh /home/pistolfly/app_dir/cron/delete_sessions.sh

script/consoleでno such file to load -- readline (LoadError)

railsのscript consoleでno such file to load -- readlineと怒られた - tetu1984の日記
CentOSにソースからインストールしたruby環境のrailsのscript/consoleで以下のエラーが発生。

$ ./script/console production
Loading production environment (Rails 2.3.10)
/usr/local/lib/ruby/1.8/irb/completion.rb:10:in `require': no such file to load -- readline (LoadError)
	from /usr/local/lib/ruby/1.8/irb/completion.rb:10
	from /usr/local/lib/ruby/1.8/irb/init.rb:254:in `require'
	from /usr/local/lib/ruby/1.8/irb/init.rb:254:in `load_modules'
	from /usr/local/lib/ruby/1.8/irb/init.rb:252:in `each'
	from /usr/local/lib/ruby/1.8/irb/init.rb:252:in `load_modules'
	from /usr/local/lib/ruby/1.8/irb/init.rb:21:in `setup'
	from /usr/local/lib/ruby/1.8/irb.rb:54:in `start'
	from /usr/local/bin/irb:13

対処方法
readline-develをインストールしてからmakeしなおす。

$ sudo yum install readline-devel
$ cd ~/src/ruby-1.8.7-p302/ext/readline/
$ ruby extconf.rb 
$ make
$ sudo make install