Redmine 1.4.0 リリース延期
用語集プラグインの Redmine 1.4 対応
以前書いた Redmine 1.4 への対応に必要な改造を 用語集プラグインに行った。
とりあえず、動作するようになった。
ただ、ぜいたくをいうと URL の表示が次のような表示になって、あまりかっこよくない。
http://127.0.0.1:3000/glossary/show?id=2&project_id=demo
Redmine 1.4.0 のロードマップ を見てみると 前 よりもさらにバグチケットが増えてて 5 件になっている。リリースはまだ当分先になりそう。
URL の表示を直すには routes.rb の設定をもっとよく調べて、ちゃんと設定しておく必要がある。
1.4.0 のリリースは先のようなので、ちょっと腰を据えて routes の修正を行うつもり。
動作自体には問題なくなったので、修正前に Redmine 1.4.0 がリリースされそうになったら、
用語集プラグインも今の状態で出そうと思う。
URL の修正はまだだけど、とりあえず動作させるだけでも、結構大変だった。
以下はその時の修正内容。
routes.rb ファイルの追加
まずは、 routes.rb の追加。 これは前に対応方法で書いたとおりのものを作成。ActionController::Routing::Routes.draw do |map| map.connect 'glossary/:action', :controller => 'glossary' map.connect 'glossary_styles/:action', :controller => 'glossary_styles' map.connect 'term_categories/:action', :controller => 'term_categories' end
project_id を使うように変更
前にも書いたが、データ要素の ID とプロジェクト ID の受け渡しに使うパラメーターのキー名が、標準的な Rails アプリと Redmine で違う。対象 | プロジェクト ID | データ要素の ID |
---|---|---|
標準的な Rails アプリ | id | xxxx_id (term_id) |
Redmine | project_id | id |
名前だけの問題だが、 Rails には 設計より規約 の方針があり、 名前が違うと予想外な影響があったりする。 今までは標準的な Rails アプリの ID の使い方をしていたが、これを機に Redmine にあわせた使い方に変更した。
form_tag でパラメーターが渡せない
一覧表示でのフィルターで使っている form_tag で挙動がおかしかった。form_tag({:controller => 'glossary_styles', :action => 'search', :project_id => @project}, {:method => 'get', :id=>'search_form'} ) doこの書き方で、 params[:project_id] というように、コントローラーにパラメーターがわたるはずだが、 なぜかパラメーターがわたらない。
上手くいくはずなのに、ちゃんと動作せず、ここが一番ハマった。 おそらく、 routes の設定の問題あたりが、からんでいるのではないかと思うけど、よくわからない。
他のフォームの場合は form_for を使っていた。こちらは同じような書き方で上手くいく。 フィルターのパラメーターを入れるモデルは作っていないので、 form_for を使うわけにもいかない。
とりあえず、動作させようってことで、非常手段。 フォームの隠しフィールドを使ってプロジェクト ID を渡した。
hidden_field_tag 'project_id', @project.id.to_s
Redmine の本体機能へのリンク
Redmine の本体機能へのリンクでもルートのエラーが発生するものがあった。用語集プラグイン ではユーザー情報へのリンクを使っていたが、いままでの形式だとルートエラーになってしまった。
link_to(h(author), :controller => 'account', :action => 'show', :id => author)これは Redmine で用意されている関数を使ってリンクを作るように変更した。
link_to_user(author)
エクスポート用リンク
用語の一覧を CSV ファイルにエクスポートする機能がある。 このエクスポートするときのリンクの記述は、以前はこんな感じ。<% other_formats_links do |f| %> <%= f.link_to 'CSV' %> <% end %>これだと上手くいかなかった。 Redmine のチケット一覧で同じような機能があるので、 それを参考に修正した。
<% other_formats_links do |f| %> <%= f.link_to 'CSV', :url => params %> <% end %>
配列クラスへの追加の挙動の変化
Redmine ではなく Ruby の 1.8 から 1.9 への変更による挙動の違いが原因で修正が必要だったものもあった。1.8 以前は配列に <<(push) を使って配列を追加した場合には、 配列が展開されて結合される。
ary = [1] ary << [2, 3] p ary # [1, 2, 3]しかし、 1.9 からは配列をそのまま追加するようになっていた。
ary = [1] ary << [2, 3] p ary # [1, [2, 3]]この部分の 用語集プラグイン の修正はすぐ出来た。
しかし、 1.9 からこんな変更が加わっていたのは知らなかった。 << を使った配列の結合は便利だったので、 自分が今まで書いた Ruby スクリプトでも多用している。
そのまま追加する方が直感的なのはわかるけど、今まで書いたコードが心配。
FC2 ブログのテンプレート用変数
FC2 ブログのテンプレートを編集するときに必要になってくる変数についての解説です。
変数の一覧自体は公式マニュアルがあります。一覧だとわかいりづらい部分も多いので、
変数と FC2 ブログのテンプレートの基本的な構成について書いてみました。
ブロック変数と単変数
FC2 ブログのテンプレート変数には ブロック変数 と 単変数 があります。ブロック変数
ブロック変数は html のコメント形式で指定します。<!--xxxx--> ブロック内 <!--/xxxx-->このブロック内の記述が特定の条件のときだけ使用されたり、繰り返して使用されたりします。
プログラミング言語でいうと if や while(for) のブロックと同じような機能になります。
テンプレートの html ファイルは 1 つですが、後述するようにブログではいろいろなモードがあり、 このブロック変数を使って、モードごとに表示内容を切り替えるのに使用します。
同じような記述方法で繰り返しにもなります。
条件分岐になるか、ループになるかは変数によって変わります。
単変数
単変数は以下のような型式で変数の部分が置き換わって表示されます。<%xxxx>例えば、 <%blog_name> と記述すると表示するときにはブログの名前になります。
単変数にはこの blog_name のようにどこでも使える変数と、 特定のブロック内でのみ使える変数があります。
モード
FC2 ブログでは 8 つのモードがあります。モード | 名前 | 概要 | このブログ |
---|---|---|---|
トップページ | index | 最新記事を複数表示 | [Home] リンクを選択。 |
ページ記事 | - | 指定ページの記事を複数表示 | トップページから次ページ [Next] などを選択 |
カテゴリ | category | 同一カテゴリの記事を複数表示 | カテゴリの単語を選択 |
タグ | tag | 同一タグの記事を複数表示 | タグを選択 |
日、月別 | date | 同一の日または月の記事を複数表示 | カレンダーから選択 |
個別記事表示 | permanent | 記事を一つだけ表示。コメントなど詳細に記事を表示。 | 記事のタイトルを選択 |
記事一覧 | titlelist | 過去記事の一覧を表示 | [Title List] リンクを選択 |
検索結果表示 | search | 検索にヒットした記事を複数表示 | メニューの入力エリアから検索を実行 |
逆に not_mode_area の変数を使うと内部がそのモードでは表示されなくなります。
<!--mode_area--> mode だけで有効 <!--/mode_area--> <!--not_mode_area--> mode 以外で有効 <!--/not_mode_area-->表のページ記事モードの名前は忘れたわけではありません。 このモードに対するブロック変数は用意されてないのです。
「なんでないの?」 とか 「トップページとわける必要あるの?」 と思われるかも知れません。 私もそう思いますが、実際そうなってしまっています。
ただ、 not_... のブロック変数を使って、 他のモードではないモードということでページ記事の内容を記述することは出来ます。
トップページ(index)、ページ記事、カテゴリ(category)、タグ(tag)、日月別(date)
モードはたくさんありますが、 この節タイトルの 5 つのモードはテンプレートでは、だいたい一緒に書くことができます。 ベースは同じにしておいて、こまかいところで各モードの mode_area を使って切り替えるというのが、 テンプレートを書くときの基本的なスタイルになっています。ここでのモードに対するテンプレートの大まかな構成は以下のような感じです。
<!-- 記事一覧, 検索以外 --> <!--not_titlelist_area--> <!--not_search_area--> <!-- 記事(繰り返し) --> <!--topentry--> <!-- 記事タイトル --> <h2><a href="<%topentry_link>"><%topentry_title></a></h2> <!-- 記事本文 --> <%topentry_body> <!--/topentry--> <!--/not_search_area--> <!--/not_titlelist_area-->まず、not_mode_area のブロック変数を使って、記事一覧, 検索以外のモードとして、5 つのモードを指定しています。
個別表示が抜けていますが、個別表示も一緒に書くことができます。これは次節で説明します。
topentry ブロックが個々の記事内容になります。ここがブログの設定で指定した回数分だけ繰り返されることになります。
topentry ブロック内では次の単変数が使えます。
変数名 | 内容 |
---|---|
<%topentry_link> | 個別表示記事へのリンク |
<%topentry_title> | 記事タイトル |
<%topentry_body> | 記事の内容 |
また、記事タイトルをリンクにして、クリックすると個別記事表示になるようにしています。
個別記事(permanent)
個別記事のモードも前節の記述を使います。先ほどのモードの場合には topentry ブロックの内容は複数回繰り返されますが、 個別記事モードとして使われる場合は 1 回だけ表示されることになります。
また、個別記事表示では、コメント、トラックバック、追記 などの記事の詳細情報も表示されることになります。
コメント、トラックバック
コメント、トラックバックにはそれぞれ comment_area, trackback_area のブロック変数を使います。このブロック内でのみ有効な単変数を使って、 それぞれの内容を記述します。これらのブロックを先ほどの内容に追加します。 これらは premanent_area ブロックで囲まなくても、個別表示モードでしか使用されません。
<!--trackback_area--> トラックバック用の記述 <!--/trackback_area--> <!--comment_area--> コメント用の記述 <!--/comment_area-->
追記
FC2 ブログには、追記というものがあります。これは後から書き足すという意味ではなく、記事のさわりの部分と全文を分けたいときに使います。
topentry ブロック内を追記に対応させて書くと次のようになります。
<!--topentry--> <h2><a href="<%topentry_link>"><%topentry_title></a></h2> <!-- 記事本文(さわりの部分) --> <%topentry_body> <!-- 追記記事へのリンク(「続きを読む」) --> <!--more_link--> <a href="<%topentry_link>#more" title="<%topentry_title>"><%template_extend></a> <!--/more_link--> <!-- 追記本文(残りの部分) --> <!--more--> <div id="more"> <%topentry_more> </div> <!--/more--> <!--/topentry-->追記関連のブロック変数および単変数は以下の表のようになります。
ブロック変数 | 記述対象 | トップページなど | 個別表示モード |
---|---|---|---|
more_link | 追記へのリンク | ○(ただし、追記がある場合) | × |
more | 追記 | × | ○ |
変数名 | 置換後 |
---|---|
<%template_extend> | "続きを読む"という文字列 |
<%topentry_more> | 追記の内容 |
ちなみに <%template_extend> は言語によって文字列の変わる 多言語用変数です。
記事一覧(titlelist)
記事一覧では titlelist ブロック変数の内容が記事の数だけ(上限 500)繰り返されます。以下のサンプルは私のブログで使っているものをシンプルにしたものです。
<!--titlelist_area--> <h2>記事一覧</h2> <ul> <!-- 記事の数だけ繰り返し --> <!--titlelist--> <li> <!-- 記事タイトル --> <a href="<%titlelist_url>" title="<%titlelist_body>"> <%titlelist_title> </a> </li> <!--/titlelist--> </ul> <!--/titlelist_area-->titlelist の中で使用できる単変数は次のものです。
変数 | 内容 |
---|---|
<%titlelist_title> | 記事タイトル |
<%titlelist_url> | 記事の個別表示へのリンク |
<%titlelist_body> | 記事の冒頭をテキスト型式にしたもの(約 20 文字) |
記事一覧モードでは、他のモードと違い、 記事の内容に関して、冒頭以上の内容を表示することはできません。
検索(search)
検索結果表示モード用の私のブログの簡易版です。<!--search_area--> <ul> <!-- 記事の数だけ繰り返し --> <!--topentry--> <li> <!-- 記事タイトル --> <a href="<%topentry_link>"> <%topentry_title> </a> <!-- 記事冒頭 --> <p><%topentry_discription></p> </li> <!--/topentry--> </ul> <!--/search_area--><%topentry_discription> は先ほどの <%titlelist_body> と同じで記事の冒頭部分のテキストになります。
これを利用して検索サイトっぽく検索結果の一覧を表示しています。
topentry のブロック変数はトップページなどのモードと同じものです。 実はこの検索用のモードは私が分けて使っているというだけで、 トップページなどのモードと同じ型式で表示することも出来ます。
テンプレートの基本構成まとめ
今まで出てきたものをあわせて、あげておきます。ここでは、検索モードを特別扱いせずにトップページなどと同じものを使うようにしています。 こうするとモードはたくさんありましたが、 記事一覧とそれ以外の 2 つのパターンだけ書けばよいことになります。
実際のテンプレートはこれにプラグインなども付けますが、 基本的な構成はだいたいこのような感じになると思います。
これが分かっていれば、テンプレートを編集しようとしたとき、 もとのテンプレートの内容を理解しやすいのではないでしょうか。
<!-- ==== 記事一覧 以外のモード ==== --> <!--not_titlelist_area--> <!--topentry--> <h2><a href="<%topentry_link>"><%topentry_title></a></h2> <%topentry_body> <!--more_link--> <a href="<%topentry_link>#more" title="<%topentry_title>"><%template_extend></a> <!--/more_link--> <!--more--> <div id="more"> <%topentry_more> </div> <!--/more--> <!--/topentry--> <!--/not_titlelist_area--> <!-- == 個別表示 モードだけで有効になる部分 == --> <!--trackback_area--> トラックバック用の記述 <!--/trackback_area--> <!--comment_area--> コメント用の記述 <!--/comment_area--> <!-- ==== 記事一覧 モード ==== --> <!--titlelist_area--> <h2>記事一覧</h2> <ul> <!--titlelist--> <li> <a href="<%titlelist_url>" title="<%titlelist_body>"> <%titlelist_title> </a> </li> <!--/titlelist--> </ul> <!--/titlelist_area-->