Ruby on Rails 2.1.0公開で、2.0系は切り捨てか

Ruby on Rails 2.1.0が公開されたようだ。
そうすると、Ruby on Rails 2.0.2は大量のバグを抱えたまま開発は終了になるのか。

2.0系が安定したら、1.2系から乗り換えようと考えていたチームも少なくないはず。

安定している1.2系はもう古いし、2.0系はバグが放置されたまま。
2.1系は安定するまで、まだ時間がかかるだろう。
どのバージョンを使うのか、難しい選択に迫られる。

Rubyらしいコードの書き方(入門編)

他人が書いたRubyのコードを見て、Rubyらしくないと思ったところがありました。
このように直すと、Rubyらしいコードになると思います。

String#+ よりも、 “#{String}”を使う。
obj.to_sしなくてもいいし。

String#+の例

year.to_s + "年" + month.to_s + "月" + day.to_s + "日"

“#{String}”の例

"#{year}年#{month}月#{day}日"

sprintf(String, *args)は、String#%と同じ。

sprintf(String, *args)の例

sprintf("%d年%d月%d日", year, month, day)

String#%の例

"%d年%d月%d日" % [year, month, day]

obj = obj + 1 は、obj += 1 と同じ。

nilとの比較は obj == nil より obj.nil? を使う。入力数が短い。

変数が初期化されていない時に初期化する処理で、よくあるのが次の書き方。

if value == nil
  value = 1
end

これは簡潔に書ける。

value ||= 1

Ruby on RailsにあるActiveSuppoertで追加されるメソッド blank? は便利なので、知っておいた方がいい。

if value == nil or value.size == 0

というコードが、

if value.blank?

と書けます。

ISBN10とISBN13を相互に変換するRubyプログラム

ISBN10とISBN13を相互に変換するRubyプログラム

# ISBN10をISBN13に変換する
def isbn10_to_13(isbn10)
  isbn13 = "978#{isbn10[0..8]}"
  #チェックデジット計算用
  check_digit = 0
  isbn13.split(//).each_with_index do |chr, idx|
    #Integer#even?はActiveSupportによる拡張
    check_digit += chr.to_i * (idx.even? ? 1 : 3)
  end
  #総和を10で割ったものを10から引き、10の場合は0にする
  check_digit = (10 - (check_digit % 10)) % 10
  return "#{isbn13}#{check_digit}"
end

# ISBN13をISBN10に変換する
def isbn13_to_10(isbn13)
  isbn10 = isbn13[3..11]
  check_digit = 0
  isbn10.split(//).each_with_index do |chr, idx|
    check_digit += chr.to_i * (10 - idx)
  end
  check_digit = 11 - (check_digit % 11)
  #計算結果が 10 になった場合、10 の代わりに X(アルファベットの大文字)を用いる。
  #また、11 になった場合は、0 となる。
  case check_digit
  when 10: check_digit = "X"
  when 11: check_digit = 0
  end
  return "#{isbn10}#{check_digit}"
end

Ruby on RailsとRuby-GetText-Packageを使った日本語メールの送信

Ruby on RailsとRuby-GetText-Packageを使った日本語メールの送信について。

Ruby-GetText-Packageは、ブラウザからのアクセスでコントローラ経由を経由してメールを送信するときは、ちゃんとiso-2022-jpに変換してメールを送ってくれます。

ですが、モデルから直接メールを送信するときは、変換してくれません。

モデルに直接アクセスした場合は、コントローラ内に記述したinit_gettextが呼ばれないため、変換されないのだと思います。

そこで、メールを送信するメソッド内に次のコードを追加することで、直接モデルからメールを送信したときにも、変換されるようになりました。

  require 'gettext/rails'
  ActionController::Base.init_gettext "…"
  GetText.locale = "ja"