Mountain Lion で rbenv + Pow 環境下で Rails をうごかす

By | 2012年12月3日

基本的にはpow + rbenvで手軽なRack環境構築をみたままやりました。

LoadError: no such file to load -- bundler/setup

基本的には問題なかったのですが上記のようなエラーが出力されていて、アプリが起動しませんでした。

これは pow がシステムの ruby を実行していため bundler がなくておこられていました。(rbenv 下に bundler をいれています。)

なので pow からも rbenv の ruby を使うようにしてやればおkです。

~/.powconfig
export PATH=~/rbenv/shims:~/.rbenv/bin:$PATH
eval "$(rbenv init -)"

よくある rbenv を使う際の設定ですね。

あとは pow を再起動してやれば起動すると思います。

rvm の場合も同じように ~/.powconfig でやればいけるとは思うんですけど

pow —print-config

としてやると POW_RVM_PATH というのがあるのでひょっとしたら path をとおしておくと勝手にやってくれるのかもしれませんね。

pow –install-systemをするのを忘れて routing されなかくて悩んでたのでみなさんは気をつけましょうw

touch ${RAILS_ROOT}/tmp/restart.txt

上記のように touch してやると再起動できます。

既にファイルがあってもタイムスタンプをみて再起動してくれるみたいですね。

しばらくこの環境で powder を使って様子見しようかなと思います。

初めて gem(ratchet-rails) を作ったお話

By | 2012年11月19日

今日はエヴァQをみにいく予定なのに爆睡してしまっていました。

関係者各位申し訳ございませんでした。

気持ちをいれかえ、みなさん今話題?の Ratchet をご存じでしょうか?

一言でいうと Twitter Bootstrap のスマートフォン版といったものですね。

それを rails で簡単に扱えるような gem を作ったというお話です。

使い方

$ echo “gem 'ratchet-rails’” >> Gemfile
$ bundle
$ rails g ratchet:install`

TODO

  • Rails 3.1 以前のもの(Assets pipeline 未使用)を対応

以下は少しつかってよさそうなのがあれば組み込みます。

  • helper
  • layout
  • scafoold にデザインを反映できるようにする
  • include 用の parts をつくる

まとめ

twitter-bootstrap-rails のコードを参考にさせてもらいました。

ratchet 自体が素の CSS, Javascript でかかれているので CSS 互換のフレームワークでどれでも気軽につけますね。

以下、作ってて感じたことをつらつらと書きます。

rubygems.org へのアップロード

gem の作り方や rubygems.org への登録へはイマドキのgemのつくりかたを参考にしてやりました。

”’Your rubygems.org credentials aren’t set. Run gem push to set them.”’というエラーがでて困ってたのですがこれは rubyforge.org へのアクセストークンをおいてなかったためでした。

rubyforge.org の pfofile ページに edit profile があるので、それを ~/.gem/credentials において再度実行すればいけました。

Tor おもしろいからもっとさわる

rails generator を作ろうとすると Rails::Generators::Base を継承してつくります。

Rails::Generators::Base が Tor::Group を継承しています。

Tor::Group が定義された順番にメソッドを実行してくれるみたいですね。

Generator のメソッド名に意味のある名前をつけれられるし、シーケンシャルに実行されるから定義するだけでいいですしね。

def add_assets { ... }
def add_ratchet_javascripts { ... }
def add_ratchet_stylesheets { ... }
def cleanup_for_old_assets { ... }

フックポイントを用意されていたりすると定義後にメソッド呼び出しを追加したり、だらだらと書いてしまったりしちゃうのですごいいいですね!

これどちらかといえば Tor の機能だから Tor に興味がわきました。

と、まぁこんな感じで ruby 力あげていこうかなと思ってる今日このごろ。

Rails.env.development? がどうやってるか調べてみた

By | 2012年11月16日

Rails.env が String のインスタンスだと思ってたのけどれど、どうやってるのか気になったので調べてみたお話。

機能自体は ActiveSupport::StringInquirer の method_missing で実装されています。
末尾が ? で、それ以前の文字列が一致するかで判断してるようです。
なるほど。

ActiveSupport が require されている状況でこの機能が使えるというわけですね。

[1] 1.9.3-p125(main)> str = "hoge".inquiry                                                                                                                                                                                                 
=> "hoge"
[2] 1.9.3-p125(main)> str.fuga?                                                                                                                                                                                                            
=> false
[3] 1.9.3-p125(main)> str.hoge?                                                                                                                                                                                                            
=> true
[4] 1.9.3-p125(main)> str = ActiveSupport::StringInquirer.new('hoge')                                                                                                                                                                     
=> "hoge"
[5] 1.9.3-p125(main)> str.hoge?                                                                                                                                                                                                           
=> true

ActiveSupport によって String クラスが拡張されていてこのようなことができるんですね。
へー。

Rails.env.class をみるとActiveSupport::StringInquirer ってなってますね。
思い込みよくない。

ruby のコードは grep で探したりしにくくて困るけど pry がかなり優秀なのでもっと pry 力をあげてこうと思う今日このごろ。

rbenv 環境で whenever を使ったバッチ処理

By | 2012年11月2日

rbenv 環境下で whenever を使ったメモ

導入は「WheneverでRailsのバッチ処理」をみれば十分かと思います。

whenever が一番いけてるなと思ったのが role を用いてサーバーの役割によって crontab への登録を変えれるところですね。

追記 2012-11-02 01:54:26

role の機能は現時点の最新版 0.7.3 ではまだリリースしてない機能みたいです。
github 上のコードのみ使えるみたいですね。
0.8.0 では含まれてるみたいなのでこうご期待!といった感じです

追記 おわり

job_type を定義しといてやれば rails runner や rake や環境依存の処理を簡単に実行できるのもいけてます。

タイトルの通り rbenv 環境下で

config/schedule.rb

job_type :rbenv_bundle_runner, "export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && bundle exec script/rails runner -e :environment ':task' :output"
 
every 1.hours do
  rbenv_bundle_runner "p 'SUCCESS!!!'"
end

そして whenever コマンドを実行すると下記のような crontab 用のコマンドが出力されます

$ whenever
0 * * * * /bin/bash -l -c 'export PATH="$HOME/.rbenv/bin:$PATH"; eval "$(rbenv init -)"; cd /home/dealforest/work/hoge && bundle exec script/rails runner -e production '\''p '\''\'\'''\''SUCCESS!!!'\''\'\'''\'''\'''

あとは –update-corntab を引数にわたしてやると crontab が更新されます

$ whenever --update-crontab

–clear-crontab を引数にわたしてやると crontab から消されます。

$ whenever --clear-crontab

これは下記でかこまれた部分のみけされるみたいなので
自分で記入したものは変更されないみたいですね。

# Begin Whenever generated tasks for: 〜
...
# End Whenever generated tasks for: 〜

しばらくこれで様子をみてみようかなと思います。

参考資料

ruby script using rbenv in cron
Frequently asked questions

RAILS_ENV 依存の定数管理に settingslogic をつかってみた

By | 2012年10月23日

どうも。最近は Rails ばかりさわってます。結構楽しいもんですね。
今回は定数管理(OAuth に使用する consumer key とか)で実際あった話をかいてみます。

結論から言うと settingslogic を使うことにしました。

settingslogicで定数を管理するがわかりやすいです。
というかこのまんま使ってます。

何か他に良いやり方や変なところがあればおしえてくださーい。

constant values in Rails
最初このやり方で定数管理をやってんたんですけど RAILS_ENV で定数の値を変えたりしようとすると条件分岐が入り可読性が下がるのが嫌だったのでパス。というか定数ファイルで条件分岐が入ってたりすると、大丈夫かな、、、という気持ちになりますね。

以下、経緯。


OAuth を利用する際にステージング環境とプロダクション環境とで consumer key and secret を変更したいことがあると思います。

コードに直接書きたくなかったので環境変数を参照するようにしていました。
foreman で起動すると .env ファイルがあると、その中身を環境変数に設定してくれる機能があります。
今まではそれに consumer key and secret を書いていました。
(環境ごとに別の .env ファイルをおいてきりわけてました)
heroku も .env を読み込み環境変数に設定すると思っていてそれでやっていたのですが、悲しいことに読み込みませんでした。。。heroku コマンドで自分で設定する必要があるみたいですね。

これで一番ハマったというかめんどくさかったのが rails console や rails server を実行すると .env の環境変数がよめないため API のリクエストに失敗します。
これが地味にというかかなりはまる。
ま、ないなら warining 出すように書いておけって話なんですけどね。

とはいえ .env の中身を export して実行しないといけないけど、export した shell からしか実行できないのでめんどくさいなと思い悩んでいたそんな時に settingslogic という gem を教えてもらいましたとさ。

めでたしめでたし。

追記 2012/10/23 22:56

以下、エントリーをおしえてもらいました。
HerokuでEnv使う