4.2上で動作します。5.2上で動作することを目指しています。Railsのメジャーバージョンアップにおける非互換性に起因するエラーとなってしまうものが多数出る見込みです。4.0で動くように修正した作業の中で得た知見をまとめたものです。非互換性とその対応alias_method_chainの削除alias_method_chainは、Rails(ActiveRecord)で提供される、既存のメソッドを差し替える、あるいは呼び出し前後に処理を挟むことができる機能です。プラグインではRedmine本体のコードを修正することなく処理を挟むことができるので広く使われています。5.1で削除されたため、alias_method_chainを使用しているプラグインは別な手段で処理を実現することが必要になりました。代替手段としてはModuleのprependを使用することが提案されています。次は、用語集プラグインでalias_method_chainを使用している箇所をprependに置き換えたときの差分です。alias_method_chainをrependに置き換え(Github)prependに置き換えた方法を様式的に示すと次のとおりです。呼ぶマイグレーションクラスの継承元に素のMigrationは使えないこれまで、データベースのマイグレーション処理では、ActiveRecord::Migrationを継承していました。5では、エラーとなります。ActiveRecord::Migration[4.2]マイグレーションコードを記述したときのRailsバージョンを指定する必要があります。NULL制約の有無、INTかBIGINTか、など)、意図しないスキーマが生成されないようバージョンを指定するもののようです。次は、用語集プラグインでマイグレーションのバージョン指定を追加したときの差分です。4.2を指定しました。指定したメソッドは、コントローラーのアクションが実行される際、そのアクション実行の直前に実行されます。各アクションは認証されたユーザーに限り実行可能であるとする場合、各アクションのメソッドの中で認証チェックするのではなく、before_filterで認証チェックするメソッドを指定しておくといった使い方です。5.1でbefore_filterは削除されています。置き換えは単純にbefore_filterをbefore_actionに修正するだけです。:import_csv_exec]次は、用語集プラグインでbefore_filterをbefore_actionに置き換えたときの差分です。3.xでは不要なようです。Redmine本体では次のチケットで削除されています。http://www.redmine.org/issues/27963そこで、今回バッサリ削除します。...」エラーとなってしまいます。次は、用語集プラグインのコントローラからunloadableを削除したときの差分です。unloadableをコントローラーから削除(Github)モデルのunloadableモデルにもunloadableの記載があったので削除します。unloadableをモデルから削除(Github)attr_accessibleの削除モデルクラスにattr_accessibleで変更可能な属性を指定することで、書き換え可能な属性とするのに使います。5では削除されています。3.x対応させた際に非推奨なのを承知で持ち込んでしまいました。置き換えは、「ストロングパラメーター」という仕組みを使います。Railsでは、HTTPリクエストとしてクライアントから送られてくるパラメーターをそのままモデルに渡してモデルの作成・更新を行うマスアサインメントという機構があります。これはコーディングが楽ですが、不用意に属性が更新され脆弱性をもたらすことになりかねません。ストロングパラメーターは、変更可能な属性を明示的に指定し、その属性以外がパラメーターに含まれていてもモデルには反映しないというものです。GlossaryStylesモデルのattr_accessible削除とストロングパラメーター導入まず、GrossaryStyleクラスからattr_accessibleを削除します。:groupby次に、GlossaryStylesControllerクラスにストロングパラメーターを実装します。end同様に、Termクラスからattr_accessibleを削除し、TermsControllerにストロングパラメーターを実装します。TermCategoryクラスからattr_accessibleを削除し、TermCategoriesControllerクラスにストロングパラメーターを実装します。次は、用語集プラグインでattr_accessibleを使っていた箇所を、ストロングパラメーターに置き換えたときの差分です。4.xではこのacts_as_listが削除されています。このacts_as_listはgemで存在しているので、別途インストールすることとします。用語集プラグインのディレクトリにGemfileを作成し、acts_as_listをgemでインストールします。'acts_as_list'Redmineディレクトリでbundleを実行します。5以降はハッシュを継承しなくなったので、ハッシュを引数に取るメソッドにパラメーターを渡していたコードがエラーとなってしまいます。hash使用箇所の例は次となります。%>明示的にハッシュに変換し、かつpermitを有効にします。%>次は、用語集プラグインでリクエストパラメーターをハッシュに変換、permitを与えたときの差分です。3.xまでは、Redmineインストールディレクトリ/public/imagesディレクトリに次の画像ファイルが提供されていました。4.0向け開発)のpublic/imagesディレクトリにはこれらのファイルが含まれていません。そこで、プラグインディレクトリのassets/imagesディレクトリにこの4つのファイルを置くことにします。プラグインディレクトリにある画像ファイルを使用する際はプラグイン名の指定が必要となるので、リンクの画像ファイル指定にプラグイン名の指定を追加します。%>次は、用語集プラグインに画像ファイルを追加しリンクで画像の指定にプラグイン名を追加したときの差分です。Redmine本体から削除された画像ファイルをプラグインのassetsに追加し、画像リンクの指定にプラグイン名を追加(Github)ActiveRecordのupdate_allの引数ユニットテスト(モデル)を書いてテスト実行して見つけた非互換なコードにupdate_allの引数指定がありました。5.2のドキュメントでは、update_allのシグニチャは次です。文字列、配列、またはハッシュでSQLの設定(SET部分)を表現する使い方の例は次です。4.0以降でこのシグニチャに変更されています。3.2でのupdate_allの引数指定は次です。文字列、配列、またはハッシュでSQLの条件(WHERE部分)を表現する一方、用語集プラグインでの使い方は次です。3.2でのupdate_allの指定となります。4.2以降(5.2を含む)のシグニチャに対応するよう変更(Github)非推奨警告で今後削除されるものルーティングに:actionは使わないサーバーを起動する際、次の警告メッセージが表示されました。6.0で削除されるとあります。values.簡単にまとめると:actionの使用はセキュリティ上よろしくない問題をもたらすので、ルーティング設定ではアクションを明示的に指定すべき。Redmine本体のroutes.rbの354行目は次の通りプラグインディレクトリのroutes.rbを評価しているコードなので、プラグイン側のroutes.rbの記述が警告対象となっています。プラグインのroutes.rbから:actionを使用している行を抜粋します。ルーティング設定を確認すると次の通りです。glossary_styles#:action先に述べたように何でもアクションが呼ばれるのはセキュリティ上問題となるので、呼び出し可能なアクションを明示的に指定するように修正します。そこで、まずglossary_stylesコントローラーに定義されるアクションを確認します。searchedit次に、それぞれのアクションがどのHTTPメソッドで呼ばれるかを調べます。searchは、GETで呼ばれますが、editはPOSTとPATCHの2つで呼ばれます。リソース指向(RESTful)では、リソースの変更(edit)では、まずeditアクションをGETで呼び、updateアクションをPATCHで呼びます。元の用語集プラグインはeditアクションをPOSTおよびPATCHで呼ぶので、ルーティング設定でリソース指向のresource指定を使うのが難しく、別の記述をしています。'glossary_styles#edit'このようにルーティング設定を書き換えた時の差分です。Railsにおけるテスト実施にあたり、テストツール(フレームワーク)として、Ruby標準搭載のMinitestと、RSpecとの2つがよく使われているようです。Redmineでプラグインの雛形を生成すると、前者のMinitest用のディレクトリとテストコードの雛形も合わせて生成されます。後者は、追加のgemを入れて自力でテストコードを作成していきます。今回はMinitestでテストを記述します。3.x時点においても実行するとエラーとなっていました。そこで、まずはテストが実行できるよう必要な修正をしていきます。プラグインディレクトリ/test/test_helper.rbの修正2つ修正をします。Redmine本体のtestディレクトリにあるtest_helper.rbを参照していますが、ディレクトリ階層(相対ディレクトリ)が1つずれています。1.xまではプラグインを置くディレクトリが、Redmineインストールディレクトリ/vendor/plugin/の下だった名残りと思われます。2.0以降は、Redmineインストールディレクトリ/plugin/に変更されました。そこで、相対パスの階層を次のように修正します。'/../../../test/test_helper')2つ目は、プラグインのテストディレクトリにあるfixturesディレクトリ内のファイルをテストで使用できるようにするよう修正します。2.0で標準搭載プラグインがRedmineインストールディレクトリ/vendor/plugins/からRedmineインストールディレクトリ/lib/plugins/に移動になったときに落ちています。Railsの機能として取り込まれた模様です。Development」で紹介されているコードへ置き換えました。Redmine::PluginFixturesLoader+endテストコードの中で、fixtureファイルを使用するときはfixtureメソッドで指定しますが、上述のコード修正を適用した場合、Redmine本体のfixtureファイル(Redmineインストールディレクトリ/test/fixtures/内)を使用するときはそのままfixtureメソッドで指定、プラグインディレクトリ下のfixtureファイルを使用する際は、plugin_fixturesメソッドで指定することとなります。NULL制約のカラムに値が未設定、カラム名のスペルミス、存在しないテーブル(モデル))があり、テスト実行はエラーになりますが、テストとしては実行可能な状態になっています。skipsテストコードが実行されています。skipsテストコードがないので0件となっています。ユニットテスト現状、存在しないモデルのテストコードとテストfixtureが存在しているので、これを削除します。NULL制約付きカラムにデータ未設定のfixtureファイルがあり、値を設定しました。NULL制約対応したときの差分です。5でのテスト(Minitest)関係の変更事項を調べてみました。実施しなくてもよさそうですが、今後を見据えて徐々に変更に対応していくのがよさそうです。5では次のテストディレクトリを生成します。integrationこれまでのディレクトリ構造との対応は次となります。5の雛形生成されるコントローラーのテストではActionDispatch::IntegrationTestを継承するようになります。IntegrationTestを継承すると、HTTPリクエストの呼び出し時にURLパスの指定が必要になります。従来のアクション名ではエラーとなってしまいました。end次の様にエラーとなります。`test_index'getの第1引数は、アクション名ではなく、URLパスを指定する必要があります。ルーティング設定でresourcesやresourceでルーティングを定義していれば、名前付きルートが生成されるのでそれを指定します。名前付きルートがない場合は、直接パス文字列を指定します。4.0(trunk)の雛形生成は従来通りActionController::TestCaseを継承するものです。テスト用メソッドでassignsとassert_templateが削除されています。これを使ったテストは書き換えが必要となります。積み残し現状まだテストが通っていないので、テストを作って通す修正が残っています。オリジナルのプラグインにはテストは雛形生成されたものがそのまま置かれています。Railsのテストはまだ理解不足なので、少し時間をかけて取り組まないと書き表せない処で今後追記していきたいと思います。次に、リリース作業(init.rb、ドキュメント)が手付かずです。4.0リリースには間に合わせたいです。1.xの頃に、用語集プラグインを見つけ、これはイイ!と使い始めました。2.x、3.x)に対しては、用語集プラグインのオリジナル作者による対応はありませんでした。2.xに対応させている人が幾人かおりましたので、それらのフォーク版の中から一つを選んで利用しました。3.xに際しては、2.x対応版をもとに、自分で泥縄的に対処しました。その経緯は以前はてな日記に書きました。http://d.hatena.ne.jp/torutk/20150321/p1RubyもRailsもかじってみたレベルだったので、フォークして動かしエラーになったところを当てずっぽうに修正し、修正内容にまったく確信が持てていない状況でした。Railsフレームワーク上で動作するアプリケーションとして作られています。5.2で動くように対応が必要となります。Railsがメジャーバージョンアップすると、かなりドラスティックに変化があります。4.0開発ブランチ(trunk/master)に入れて、出たエラーをつぶしていこうとしましたが、少なくはない変更、手に負えない変更があり、早々に挫折しました。挫折に至る経緯は次のはてな日記に書いています。4.0に対応させるには、Ruby力、Rails力、Redmine・プラグイン作成力を高める必要を痛感しました。そこで、まず、用語集プラグインをゼロから実装してみることでプラグインの作り方を学びました(5〜6月)。そのときの作業を次のWikiページにステップバイステップで書いています。4.0対応を開始しました。2か月の特訓(?)の成果で、今度は「分かるぞ、このエラー、直し方!」と自らの能力向上を感じました。4対応の用語集プラグインのコードは次のGithubのブランチ上にあります。upLoginユーザーは見つかりませんでした。