5分でわかる Ruby を知らない人が Ruby の便利さを学べる記事をかいたよ を勝手に改造

5分でわかる Ruby を知らない人が Ruby の便利さを学べる記事をかいたよ

って記事があってとっても感動しました。RubyではRailsとかSinatraとかのWebアプリのフレームワークが流行っていますが、もっとお手軽にちょっと便利な使い方を紹介するのっていいですよね!!

ただ書き方が少し冗長なコードが多くて、元ネタのPHPよりもRubyが長ったらしいと誤解されてしまっている節があります。



もうちょっと短く書けるよ!!
ってことで書きなおしてみました。

>コピーライトの西暦を自動更新

>Ruby を使えばページフッタの西暦も自動更新します。
before

Copyright (c) 20010-<%= Time.now.strftime("%Y") %> Weble inc. All Rights Reserved.

Time#yearってメソッドがあるのでそっち使ったほうが素直ですね。

after

Copyright (c) 2010-<%= Time.now.year %> Weble inc. All Rights Reserved.

>他人のサイトの内容を読み込む

before

<%=
require 'open-uri'
open("http://google.com/") do |f|
  f.each do |line|
    puts line
  end
end
%>

htmlぐらいの長さのものであればIO#readを使って問題ない。
#これ、相対リンクに対応できてないのでまともに使えない。iframeとか使うべき


after

<%=
require 'open-uri'
puts open("http://google.com/").read
%>

>複数のメッセージをランダムに表示

before

<%=
  if RUBY_VERSION < '1.9.0'
    class Array
      def choice
        at( rand( size ) )
      end
    end
  end
  message = ["メッセージA", "メッセージB", "メッセージC", "メッセージD", "メッセージE"]
  message.choice
%>

このコード、at()をself[]にすれば1.8でも動きますね。
でもArray#choice追加するのもいいんですが、
↓のでいいでしょ。オリジナルのPHPもこんなかんじだし。


after

<%=
  message = ["メッセージA", "メッセージB", "メッセージC", "メッセージD", "メッセージE"]
  message[rand(message.size)]
%>

>指定した月のカレンダーを出力

>少し長いですが、2010年12月のカレンダーを出力します。
before

<%=
require 'date'
 
def calender(year, month)
    jpweek = ['日', '月', '火', '水', '木', '金', '土']
    date = DateTime::new(year, month, 1)
    date = (date >> 1) - 1
    days = date.day
    one = Date::new(2010,12,1)
    week = one.wday
    day = Array.new(42)
 
    days.times{|i|
        day[week + i] = i + 1
    }
 
    calender = '<table><tr>'
    jpweek.each{ |i|
        calender << '<th>' + i.to_s + '</th>'
    }
    calender << '</tr>'
    key = 0
    day.each{|i|
        if key.to_i % 7 == 0 then
            calender << '<tr>'
        end
        calender << '<td>'
 
        if i != nil
            calender << i.to_s
        else
            calender << '&nbsp'
        end
 
        if key.to_i % 7 == 6
            calender << '</tr>'
        end
        key += 1
    }
    calender << '</table>'
    return calender;
end
print calender(2010, 12)
%>
  • 引数のyear, monthが結局使われてない
  • 日数の計算をしていないので2月でも31日まででる
  • calenderじゃなくてcalendarね (確認したらPHP版で既に間違っていた((((;゚Д゚)))) )

とかバグが目立ちます。PHPのコードをportできてない。
Dateクラスのメソッドを利用すれば、もっとシンプルにかけます。


after

<%=
require 'date'
 
def calendar(year, month)
  date = Date.new(year, month)

  cal = "<table>\n"
  cal << "<tr><th>日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th></tr>\n"
  cal << "<tr>"
  date.wday.times{cal << "<td />"} unless date.wday == 0
  while date.month == month
    cal << "</tr>\n" << "<tr>" if date.wday == 0
    cal << "<td>#{date.day}</td>"
    date = date.next
  end
  (6 - date.wday).times{cal << "<td />"} unless date.wday == 0
  cal << "</tr>\n"
  cal << "</table>"
  
  cal   
end

print calendar(2010, 12)
%>

まとめ

こうやって偉そうに書いていますが、自分もまだまだRuby修行中です。もっと良い書き方がきっとあると思うので、見つけたら教えてください!!










ぶっちゃけ

こういう分野ではJavascriptの方が簡単だしサーバに負荷がかからなかったりと良いことづくめ!
みんなJavascriptを使おう!



5分で分かる JavaScript を知らない人が JavaScript の便利さを学べる記事を書いたよ
http://d.hatena.ne.jp/ginpei/20101230/js_beginner