トップ 最新 追記

2012-08-09 [長年日記]

_ CentOS 5 + REE 1.8.7 + Rails 3.2 + RailsAdmin + Dragonfly 0.8とかの話

新しくプロトタイプを作るのに Rails 3.2 を使ってみた。感想とハマりメモともろもろ。

環境

  • CentOS 5
  • REE 1.8.7
  • Rails 3.2
  • RailsAdmin ( Rails 3.1+ / Dragonfly 0.9+ )
    • bootstrap-sass
    • Devise
    • CanCan
  • Dragonfly 0.8
  • bootstrap-sass-rails
  • kaminari
  • html5_validators

Rails 3.2

インストールとかは別に苦労ないので省略。

RailsAdmin でハマったこと

sferik/rails_admin

  • Devise で AdminUser っていう管理ユーザー用の Model を作ろうとすると動かない
    • routes.rb の記述を RailsAdmin 標準とは逆に devise_for -> engine の mount の順にすると ok
  • RailsAdmin の日付の解釈が生々しくて ja locale をそのままバンバン当てると全部 invalid になる
    • ja.date.formats.admin: '%Y/%m/%d (%a)' みたいにしておいて RailsAdmin から format 指定をこっちに向けると通る
  • :inverse_of なんてついてない
    • これついてないと associate 先の編集とかうまく機能しない

RailsAdmin 動かすまで :inverse_of は知らなかったけど、これいいですね。情報が少ないけど、SQL の発行が減るのでどんどん使いたい。

cf. RailsAdminがリダイレクトループする場合はdeviseとmountを入れ替える ― Gist

Devise + CanCan

Devise とか分かんなかったけど、RailsAdmin の generator が親切ではいはいって言ってれば使えるようになる。

Devise は基本的には認証しか考えてないので、権限の分離は CanCan で行う。その際、role 用の field は自分で作るようだ。RailsAdmin インストール時の Devise のために作られる table にはそういう情報を入れておく場所はない。自分で考えて自分で作る。

CanCan はふざけた名前だなと思ったけど、まぁ記述はシンプルだしデフォルトの設定も楽なので、これはよいと思う。CanCan 使わないとしてもユーザー用の table にそれっぽい field があって値は残るわけだから、なんかもっといいものが出てきても乗り換えられそう。

Dragonfly 0.9 でハマったこと

Dragonfly 0.9 は標準では RMagick を使わないんだけど、そうするとなぜか Linux でだけ identify に失敗するという謎現象が起きた。手元の Mac では大丈夫なのでたぶん ImageMagick のバージョンの違いかなぁと思いながら、Dragonfly-RMagick なんてものがあるじゃんと思ったらこれは RMagick 2 系で、RMagick 2.x は CentOS 5 でフツーに使える ImageMagick とは合わない。(6は知らない)

つーことで実績のある Dragonfly 0.8 系にスイッチ。

しようとしたら RailsAdmin が 0.9 以降を要求していたんだけど、RailsAdmin を clone してきて一部直したり Model に直接手を加えたりしてとりあえず動くようにした。(bundler で gem を管理している現代はこんなの簡単にできる。)これでとりあえず安定してる。

Paperclip に Ruby 1.8 + Rails 3.2 で動くバージョンがあればそれを採用する方が楽なような気がしないでもない。時間が取れたらというかどっかに動作実績があればそっちに転ぶかも。(ぐぐったけどすぐ見つからなかったのでとりあえず諦めた。)

therubyracer

execjs が今年の 5月に spidermonkey runtime を deprecated にしたので therubyracer gem をインストール。意外にすんなりできた。心配する必要なかった。

bootstrap-sass-rails

yabawock/bootstrap-sass-rails · GitHub

bootstrap 系の gem がすごく多くて意味が分からないんだけど、RailsAdmin を使っていないなら twitter-bootstrap-rails がいいと思う。generator も親切。でも RailsAdmin とぶつかるので bootstrap-sass-rails にした。

3.1 以降標準の sass-rails にだけ依存してる素直ないい子。

※ デフォルトだと application.css で @import "twitter/bootstrap" しただけだと responsive にならない。@import "twitter/bootstrap/responsive" も要る。

bootstrapとkaminari

きれいにハマった。ポイントは簡単で、

全部 a に入れろ

だった。非 JS 環境を考えると普通 link しない current page などは a なしで書いてしまうが、そうやると bootstrap の pagination の装飾がうまく動かない。

nestedなvalidationのあるModelに素朴にseedを突っ込む

validates :photos, :presence => true unless defined? Rake

みたいなことして回避した。いいのかな。いいよね。

あーでもこれだと rake spec 中も回避しちゃうね。また考えるか。本当のこと言うと end-to-end でテストすればいいのかもしれないけど、RailsAdmin は JavaScript バリバリなのでちゃんと request spec 動かせるか心配。

capistrano/ext/multistageとrsync_with_remote_cache

vigetlabs/capistrano_rsync_with_remote_cache

  • 最近の capistrano は capistrano-ext の機能は同梱
  • rsync_with_remote_cache を使うと remote には scm 要らない
config/deploy.rb

require 'capistrano/ext/multistage'

を追加し、

config/deploy/staging.rb

を用意して

set :rails_env, "staging"

set :deploy_via,   :rsync_with_remote_cache
set :scm,          :git
set :repository,   "."
set :deploy_to,    "/path/to/app"
set :copy_exclude, %w(
  .git
  db/*.sqlite3
  log/*
  *~
)

みたいにする。deploy 先のサーバの参照できる場所に scm はなくてもよい。その代わり rsync がないとダメ。これはこれでよいな。

assetsのprecompileとfallback

まだ production で動かしてないんだけど。

config/deploy.rb

にデフォルトではコメントアウトされてる

load 'deploy/assets'

を足すだけで deploy したら remote で assets を precompile してくれる。ただし staging で動かす場合は

set :rails_env, "staging"

をちゃんと用意しておくこと。

考えたら precompile してくれるなら therubyracer は production サーバに要らねんじゃね?と思わなくもないけど、現段階ではあまり細かく気にしないようにしよう。たぶん local で compile して上げるって方法もあるんだろうけど、とりあえずこのままで。

とか考えてる人がいるみたいだ。確かに precompile が入ると deploy の時間が長くなる。

config/environments/staging.rb

config.assets.compile = true

があれば precompile に失敗してても大丈夫なように見えるんだけど、うまくいってんだかいってないんだかよく分かんない。今のところ precompile で困ってない。

databaseはとりあえずSQLiteをsharedに

config/database.yml

staging:
  adapter: sqlite3
  database: ../../shared/db/staging.sqlite3
  pool: 5
  timeout: 5000

にするといいんだけど rails の process owner と db の owner が合わない場合もあるので、

config/deploy/staging.rb

namespace :db do
  desc 'make shared db directory writable'
  task :writable do
    sudo "chmod -R go+w #{shared_path}/db"
  end
end
before 'deploy:restart', 'db:writable'

こんなことしてこの shared の db を world writable にしちゃう! いいんだ、staging なんだよ!

PassengerのSUB URI

 RackEnv staging
 RackBaseURI /hoge

してる場合

config/environments/staging.rb

config.action_controller.relative_url_root = '/hoge

しておく。これでも別 Engine (RailsAdminなど)からの routing などは一筋縄ではいかない。SUB URI めんどくさい。

幸い production は SUB URI にならない予定だけど。

RailsAdminのShow in App差しかえ

RailsAdminの

lib/rails_admin/config/actions/show_in_app.rb

       register_instance_option :controller do
         Proc.new do
           redirect_to main_app.url_for(@object)
         end
       end

こんなコードがあって、RailsAdmin 上から確認のアイコンなどをクリックするとその resource のフロントエンドに直接リンクを飛ばしてくれる機能がある。

んだけど、RailsAdmin 標準というか行儀のいい resource を routes.rb に書いてないとうまく動かない。

仕方ないのでこれパクって

config/initializer/rails_admin.rb

内で似たような action 書いて url_for の部分をどうにかした。RailsAdmin の config 周りは全体的によくできてると思うんだけど、残念ながら actions 周りはまだだいぶ気が利かない感じなのでこれからどんどん DSL も変わっていきそうな予感。

Tags: Ruby Rails

2012-08-18 [長年日記]

_ kanazawa.rb meetup #1 に参加してきた

参加してきたっつーか、まぁやるって決めたの自分なんだけど。

Intro

introを英語プレゼンにしたら会場のボルテージが上がるのではないか? meetup ってなんか英語っぽくね?

「ぽかーん」「ぷーくすくす」「ア…ア…」

大失敗orz

全体的な準備

正直ものすごく手間が掛かった。始まってみたら想像以上の人数で余計なこと考える必要ない状態だったので、まぁ結果オーライなんだけど。さすがにatndの管理、お店の予約、施設の予約、あれこれissue起こして自分の発表2つ分のスライド作って…、ってのはもう二度とやりません。これは絶対に持続できない。

あとあえて出欠確認表を現地で印刷しようと思ってPDFだけ作ってノートPCに入れたままの状態で持っていったんだけど、会場にいちばん近いコンビニではUSBメモリから印刷することができなかった。この辺はまだ都会ほどには充実してないんだな、やっぱり。仕方ないから無印で「チェックリスト」っていうメモ帳買った。これなかなか便利だ。20人程度なら手でチェックリスト作って回せるレベルなので、実はこんなんでいいんだな。

あとさんざん自分で書いてたのにテーブルタップ持っていくの忘れちゃった。これは現地の無印で購入。やっぱ便利な場所はいいね。

発表準備

直前まで普通に動いてたんだけど先にPDFを上げておくといういつもと違うことをやったらデモ環境壊したらしく、デモ失敗。

先にPDFを上げておいたのに広報忘れ。

もう完全に Intro で燃え尽きてる感。

というかやっぱ発表に集中できるわけないんだからあまり手の込んだこと考えるんじゃなかった。

時間設計

やっぱ自己紹介は長くなるよね。ここは実は想定してたので後ろの時間はゆるゆるにしておいた。ほんとはもうちょっともくもくできればと思ったけど、まぁ初回で欲張りすぎてもしょうがない。

今回の発表とスライド作りに向けて思っていたこと

テキストフォーマッタで学ぶRubyとGemの基礎 // Speaker Deck

今回の自分のプレゼンはいつもに増して詰め込んだんだけど、これには明確な理由があって、

GitHubを活用できるRubyistスターターキット

の一部を担うものを作りたかったから。RubyとGemの基礎と言ったな。あれは嘘だ。

次回以降も今回のスライドがきっと役に立つと信じているし、ぜひPDFをダウンロードしていい具合にみんなに活用してほしい。そのまま使う必要はなくて、好きなように切り刻んでほしい。必要なリンクはだいたい網羅してると思う。

インストール方法とかは入ってないけどね。

というわけでgithubへのお誘い

kanazawarb (kanazawa.rb)

kanazawa.rbの本拠地は今のところgithubです。

  • 何が起きているか、起きそうか知りたい方は star してください
  • 通知が欲しい人は watch してください
    • owner, contributor の方はぜひ watch してください

全体の感想

ちょっと欲張りすぎて疲れました。でもあとで気づいたけど本当は当日の自分の役割はもっと期待してた。欲張りすぎてるなぁー。

もくもくの時間と空間がちょっと足りなかったので当初期待してた活躍を期待してた人にしてもらうことはなかなかできなかったけど、それはまた今度。(該当する人、お願いね)

それ以外の部分ではいろいろなご協力をいただきましてまぁなんとか初回の格好だけはついたかなと思います。

ただちょっとお膳立てしすぎたところはあるので、「自分たちで」実現していくコミュニティとなるにはまだちょっと経験が必要になると思う。

もうちょっとだけ頑張ろうね。

とにかく、今日が kanazawa.rb の誕生日だね。おめでとう。

またね。