用語集(データディクショナリ)は、ソフトウェア開発プロジェクトにおいて重要な情報です。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
RailsもRubyも中途半端な理解なので、修正がただしいのかどうか確信が持てない箇所が多々ありますが、一通り動いたかなという状態で、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)対応するための修正のポイント
rubyもRailsもちゃんと分かっていないので、かなり場当たり的な対処です。
ルーティング設定
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では非推奨らしいのですが、ここはとりあえず動くこと優先で指定しました。