torutkのブログ

ソフトウェア・エンジニアのブログ

用語集プラグイン(glossary)をRedmine 3.0で動くようにしてみる

用語集(データディクショナリ)は、ソフトウェア開発プロジェクトにおいて重要な情報です。Wikiで作成すると、量が増えるほど編集が大変になってきます。ところが、Redmineにはそのものずばり用語集プラグインがあります。
http://www.r-labs.org/projects/rp-glossary/wiki

しかし、残念なことにRedmineのバージョンアップに追従しておらず、redmine公式のプラグイン帳にも対応バージョンが1.2となっています。
http://www.redmine.org/plugins/glossary

ところが、世の中にはこのglossaryプラグインをフォークしてRedmine 2.xに対応させている人がおります。
https://github.com/chiastolite/redmine_glossary
とか
https://github.com/maxrossello/redmine_glossary
とかです。

しかし、Redmine 3.0には対応していません。(参考 id:torutk:20150228)
やはり、Rails 3.2からRails 4.2への変化がプラグインに対していろいろ支障を招いています。用語集はあきらめるには惜しいプラグインなので、試行錯誤をしながら用語集プラグインRedmine 3.0.0で動かすように修正してみました。

エラーを泥縄的に修正してみた経緯は次に記録しています。
http://www.torutk.com/issues/40

RailsRubyも中途半端な理解なので、修正がただしいのかどうか確信が持てない箇所が多々ありますが、一通り動いたかなという状態で、Githubに上述maxrossello版のフォークを作成してブランチfeature/redmine-3として修正を上げました。
https://github.com/torutk/redmine_glossary/tree/feature/redmine-3

(追記)masterブランチにマージ済みです
https://github.com/torutk/redmine_glossary

個人メモ

plugins$ git clone https://github.com/torutk/redmine_glossary.git
plugins$ cd redmine_glossary
redmine_glossary$ git checkout -b feature/redmine-3 origin/feature/redmine-3
Branch feature/redmine-3 set up to track remote branch feature/redmine-3 from origin.
Switched to a new branch 'feature/redmine-3'
redmine_glossary$

プラグインRedmine 3.0(Rails 4.2)対応するための修正のポイント

rubyRailsもちゃんと分かっていないので、かなり場当たり的な対処です。

ルーティング設定

Redmine 2.x までのmatchメソッドで書かれたものは、viaオプションが必須になったので、修正が必要になります。
また、edit(編集)のリクエストがHTTPのPATCHメソッドになったらしく、viaオプションが指定されていてもget, postでは不足です。viaオプションにpatchを追加しました。

ActiveRecordのfind系メソッドがActiveRecord::RecordNotFound例外を上げる

Redmine 3.x(Rails 4.2)では、ActiveRecordのfindメソッドが検索結果0件のときにRecordNotFound例外を上げているようです。また、動いているようですがRails 4では非推奨なfindの使い方なので変更しました。

たとえば以下のような感じです。

  • Model.find(:first, :conditions => "alfa = #{@alfa.nval}") を Model.find_by(alfa: @alfa.nval)
  • Model.find(:all, conditions => querystr) を Model.where(querystr)
  • Model.find(:all) を Model.all

find(:all, ...)の返り値は配列ですが、whereやallの返り値はリレーションになったので、配列として処理したいときはto_aを使います。

データの保存ができない

なぜか保存ができず WARNING: Can't mass-assign protected attributes が出ていました。
モデルにattr_accessible設定をして回避しました。
attr_accessibleは、Rails 4では非推奨らしいのですが、ここはとりあえず動くこと優先で指定しました。