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 << ' ' 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