2010年12月26日日曜日

Rails3でModel.allなどのデフォルトのソート値を変えたい

default_scopeとnamed_scopeを使う

default_scopeは使い方には注意が必要です。publishedをdefault_scopeでやってしまうと、管理画面などで非公開中の記事も含めた結果を得たい場合に無駄なコードが発生しまいます。それよりはnamed_scopeを使った方がいいし、メソッド名がさらに何をしているかを分かりやすくしてくれます。

元記事はRyan's Scraps - What's New in Edge Rails: Default Scoping

CakePHPではdefault_scopeと同じことはできますが、named_scopeは今もメソッドを用意するのがベストプラクティスなんじゃないでしょうか。もっといいやり方知ってるよーって方は教えて下さいm(_ _)m。この記事おすすめです。Sooey - CakePHPを使ったMVC設計のベストプラクティス

2010年12月24日金曜日

Rails3 Ruby1.9.2でGmailを使う時はtlsmailは必要ない罠

tlsmailをrequireするとmail 2.2.13からエラーが出て起動しなくなる

`remove_method': method `tlsconnect' not defined in Net::SMTP (NameError)

このエラーのせいで立ち上がらない><

そもそもtlsmailが要らないというオチ

普通にこうかいたらできました...

2010年12月18日土曜日

Redmineは鋭意開発中

今後のリリースプランが発表されました

Plans for next Redmine releases

1.1は何週か後にリリース予定。1.2ではこれまでに要望が多かったチケットに関する機能の強化、1.3でも要望が多かった機能を実装していく予定で、具体的にどのような機能を予定しているかも書かれています。

前回の、「Redmine開発がちょっとヤバイぞ」が意外にアクセスがあったので、不安を煽ってすみませんm(_ _)mということで、速報記事でした。w

2010年12月17日金曜日

Rails3でDeviseを2つ使ってみる

Deviseは認証系

Deviseを使うと、メールでのアクティベーションとか次回ログイン省略とか、TwitterだOpenIDらもできる?(ここまで入れるとOmniAuthになるんかな?) WardenベースのRails以外でも使える認証系ライブラリです。githubにあります。

使い方とかはgithubにあるwikiやrailscastsやREADMEを翻訳してくれてるサイトにまかせて、今回はあまりやらないであろうマイナーチャレンジとして、deviseを2回使ってみましたw

ユーザと管理者を別モデルにしたいじゃんというお話

rails g devise MODEL でいくつも作れるので特にdeviseの最初から書かれてあるオプション通りであれば問題はないのですが、どれかだけ認証の方法をメール+パスワードから別のものに変えたいという場合や、複数のdeviseでログイン成功後のリダイレクトの先を変えたいというニーズはあって普通と思うし、後者はwikiに書かれてました。前者はあるのか知らないけど、MLで質問したら教えてもらったのでせっかくですのでブログに残しておきます。(前置き長い)

UserモデルとAdminモデルで認証方法を変える

やり方は簡単で

  • 認証方法を変えたいモデルでクラスマクロdeviseで:authentication_keys => [:foo]
class Admin < ActiveRecord::Base
  devise :authentication_keys => [ :name ]
end
と書けばOK。:passwordを書くとエラーが起きるので書かない。もしリダイレクト先を変えたければ、routesとapplication_controllerで制御する方法がgithub上のwikiに載っているのでそちらを参照

Deviseのお陰で認証部分をほとんと作らずに済んでかなり助かってます。が、viewは簡単に操作できるからいいとして、認証まわりは結構隠蔽されていて分からない。今後は日本の携帯デバイスなど、PCブラウザ以外のところで問題が起きた時が厄介そうだと思いつつも、MLは活発で質問したらすぐに返答が来たので、今後も使って行きたいところ。

2010年12月13日月曜日

Rails3で国際化とデフォルトロケール設定と日本語をコード内で使うことと

# encoding: UTF-8をline:1に書かないとinvalid multibyte char (US-ASCII)

Viewファイル内では普通に日本語が使えるのに、コントローラとかじゃ使えないじゃん!ということになる。RailsじゃなくてRuby1.9からエンコーディングの指定方法が変わったからかな?UTF-8なら書かなくても動くと思ってたけど...とにかく動かないよー(T_T)という時はマジックコメント。

デフォルトロケール設定

$RAILS_ROOT/app/config/application.rb

config.i18n.default_locale = :ja

ActiveRecordなどのエラーで、翻訳がないというエラーが出るようになるので、心の準備はしておきましょう。(翻訳作業が発生します。)

2010年12月2日木曜日

Redmine開発がちょっとヤバイぞ

Eric Davisが開発から身を引いた

Stepping Down From Redmine

Redmineの作者Jean-Philippe Langが途中いなくなった時期があったんですが、最近やっと復活したようですね。でも残念なお知らせ、コアディベロッパーのEricさんが開発から身を引くそうです。Ericさんがいなかった時期も、Redmineはきちんと開発されてきたけど、Ericさんが入ってからもっとよくなったという印象が個人的にあるために残念。しかも身を引く理由の本当の部分を明らかにしてないけど、どうも内部でもめてる様子。

Railsのバージョンはまだ2.3.5で止まったままだし、Ruby1.9.2に対応するには書き直す部分もありそうで、結構ふくれあがって来てると思う。そんな時に組織が崩壊し始めたら死んじゃうんじゃないだろうか。と、ちょっと不安。Redmineを超える新しいツールが出るといいけどね。作るか?って話をしてる人たちもちらほらいそうだ。

2010年12月1日水曜日

RailsをUnicornで動かしてみる

Redmineを動かしてみた

Apache + Passenger (REEで)は、起動中は素晴らしいパフォーマンスを出してくれるけど、一旦落ちると、起動するのに時間かかるし、デプロイするときに再起動しないといけない。再起動はapacheではなく、Passengerがtmp/restart.txtが生成されたタイミングでアプリを再起動してくれるからいいっちゃいいんですが、unicornはその辺もOK!と。そしてよく分からないfork型?とにもかくにも、unicornを知ってもう一年!一回くらいは試しておこうと思ってやってみました。そのうちnginxとの組み合わせもやります。

unicornのインストール

gem install unicorn

Rails2.3.5はRack1.0.4を使う

1.0.4だったっけかな?忘れましたが、1.2とか上のバージョンのが入ってると動いてくれません。アンインストールする必要があります。Rails3はRack1.2でも動きます。

起動の仕方は簡単で、RAILSアプリのルートフォルダで

unicorn_rails -D -E production
という感じです。Dオプションはデーモン、Eは環境、デフォルトはdevelopment、-cで設定ファイルのパスを渡すこともできます。

unicornは起動に失敗しても永遠と起動しようと努力するので、ちょっとその執念深さが怖かったのですw

気になるパフォーマンスは

ちゃんと取ってないけど、Passengerの方が若干早いかなという感じ(2ミリ秒くらいw)で、差はそんなにない感じです。nginxと組み合わせて、Apache + Passengerと比べてどうなるかは分かりませんが、きっとそんなにパフォーマンスに差はないんじゃないかなーと思います。なんせRedmineを3人くらいで使ってるので。これが大規模サイトになれば違うんでしょうね。githubがunicornで動いてるんじゃなかったかな?githubの中にはちゃんとチューナーがいそうなので、うまくまわってるんでしょう。