人生で初めてrubyのソースを見た日、人生で初めてRedmineのソースコードをいじった日

仕事でRedmineを使っている。といっても、私はたいして使ってない。この手のツールは苦手なのだ。でも仕事上社内で使っている人は多い。
今日はその部分改修を要望されてしまった。ガントチャートをズームしたときに、最大ズーム時に曜日と日が重なって見えないというのだ。

私はこれはもともとのバグだと思っていたし、特に気にならなかったのだが、依頼者はかなり気になっている。で、これを直してくれという。
まあこの程度なら直せるだろうとタカをくくって適当にソースを追いかける。Ruby on RailsといったってMVCフレームワークだからだいたいパターンは判るだろうと、アタリをつけてソースを見ると、app/views/gantt/view.html.erbなるファイルが該当した。

アタリの付け方としては、Firefoxの右クリックメニューで「要素を調査」というのがあるので、直したい部分でこのメニューを選び、どのスタイルシートが適用されているかを調査。希望する箇所はどうやらdivタグ埋め込みの要素だったので、CSSの修正程度では収まらないことが判明。
とはいえどのファイルなのかを探すために、divタグで適用されているCSSクラス名を手掛かりにgrepをかけると、view.html.erbファイルでほぼ合致したという運の良さであった。

それでこのファイルのバックアップをとっておき、編集して修正。
「Days headers」というコメント以下にあるdivタグが曜日を出す部分のようであった。divタグのトップからの位置が「top = (show_day_num ? 55 : 37)」のように指定されているにも関わらず、変数topを使ってスタイルが指定されていなかったので、「
top:< %= top %>px;」のように変数を指定して保存。そしてブラウザを再読み込み……。

まったく変わらない。
あれ、該当箇所じゃないのか……。
どれだけ調べても該当箇所としか思えず、Redmine中のソースをどんだけgrepしてもやはり該当箇所はこのファイルとしか思えなかった。

問題はキャッシュなのだろうか。ブラウザのキャッシュはさんざん消したけれど効果なし。じゃあRedmineかRuby on Railsのキャッシュかと思ってウェブを調べると、rakeコマンドなるものがあって、「rake -T cache rake tmp:cache:clear」のようにキャッシュをクリアできると書いてある。実行してみてからブラウザを再読み込みしたが、やっぱり修正が反映されない。

そうこう調べているうちに、もしかしたらmod_redmine的なものがあるのだろうか……などと気になって調べてみたら、PassengerRubyなる単語に突き当たる。検索したらRedmine.JPサイトがヒットしたので開いてみると、「Apache上でRedmaine等Ruby on Railsアプリケーションを実行するためのソフトウェアであるPassenger 2.2.x(略)」などと記載されている。なんだと!? もしやこいつがコンテンツキャッシュの原因か……。
Passenger自体はPhusion Passengerなる別の開発元があって、そちらにあるユーザーズガイドのリンクがあったので確認してみる。すると、この3.3項目に何やらアヤシゲなことが記載されているではないか……。

There are two ways to restart the application:

1. By restarting Apache.

2. By creating or modifying the file tmp/restart.txt in the Rails application’s root folder. Phusion Passenger will automatically restart the application during the next request.

Apacheの再起動か、restart.txtを適切な場所に配置せよということのようだ。
とりあえずユーザも少ないのと、ほぼ確実に実施できると思えるApacheの再起動で対応してみよう。だめだったらrestart.txtだ。
そしてApacheの再起動……CentOSだったので「service httpd restart」する。そしてブラウザ再読み込み……。

おお! ようやく修正が反映されたページになった! しっかし、毎度毎度再起動って嫌だな……。redmine/tmp/restart.txtファイルを都度touchするほうがいいのだろうな……。

※Twitterでも@にてrestart.txtの件の情報を頂いた。こうしたゆるいソーシャルは本当にありがたい。

ところでこの不具合、調べている過程でどうも元からの実装ではなさそうな感じがしてきた。そして次のページにたどり着く。

■Redmineガントチャートの日付表示再び – 100ねんごの未来予想図
http://in.shappi.org/article/195687999.html

私が半日眺めていたコードとまったく該当する。
で、先ほどの依頼者に聞いてみたら、別のエンジニアに依頼をして(別のだけれど)修正をしてもらったということらしい。で、上記URLのブログ記事には、その当時の依頼であったPDF出力に関する部分もあった。
うーん、これ記事読みながら修正したのか……それでエンバグしてたのかもしれんな。

しかし……。
このブログ記事にはファイルも直接ダウンロードできるよう取り計らいがされていたので、view.html.erbをダウンロードしてコードを眺めてみたら、私が修正した箇所がちゃんと実装されているコードになっているではないか。どうも記事中にはその修正まで触れてなかったみたいだが、ダウンロードのソースにはちゃんとそう記載されているので、これはウチの実装者が単純なコピペだけで対応した結果だな……とか思ったのであった。だから依頼者のいくつかの要求にも適切に応えられていなかった。

もーなんだよ……こんなんで半日潰してしまったとは……。Redmine恐るべし。

おまけ。

さらに3段目のズームのときに日付が表示されないから何とかしてくれという矢継ぎ早の依頼があったので、これにも対応。
show_daysをtrueにすればいいので、view.html.erbの上の方にあるif文群の一部条件をコメントアウトという荒業に。

[ruby]
if @gantt.zoom > 1
show_weeks = true
headers_height = 2 * header_heigth
if @gantt.zoom > 2
show_days = true
show_day_num = true
headers_height = 3 * header_heigth
if @gantt.zoom > 3
#show_day_num = true
headers_height = 4*header_heigth
end
end
end
[/ruby]

#でコメントアウトしてある1行と、コメントアウトした行と同じ行が3行上に追加されている。ズーム段数は@gantt.zoomで確認できるっぽいので(rubyの文法とか構文とか知らないから@が何を示しているかは全く調べていない……ひどいな俺……)、ズーム段数が2より大きい場合に処理をshow_daysとshow_day_numをtrueに設定。この多段if文もちょっとなあと思いつつも、余計なところには触れずにそっと終了した。

たのしいRuby 第3版プログラミング言語 Ruby改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)入門Redmine 第3版たのしいRuby 第4版

コメントを残す

メールアドレスが公開されることはありません。