その他
    ホーム 技術発信 DoRuby Redmine3.4.3にredmine_backlogsを入れた時の備忘録
    Redmine3.4.3にredmine_backlogsを入れた時の備忘録
     

    Redmine3.4.3にredmine_backlogsを入れた時の備忘録

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    新しいバージョンと古いプラグインはキノコとタケノコくらいに相容れない

     Redmine3.4.3にプロジェクト管理ツールであるBacklogのRedmine用である、redmine_backlogsを入れてみたのですが、その時に色々と詰まったので書き残しておきます。

    動かせるようになるまでの過程

    1

    まず、普通にredmine_backlogsをRedmineのプラグインとしてgitから落としてきて、

    bundle exec rake redmine:plugins:migrate RAILS_ENV=production
    

    を行ったらエラーが発生した。
    そこから色々手を加えたりして、頑張ったりしたけれど簡単な解決があった。
    Redmine3.2にredmine_backlogsを入れた人のブログがあったので、それを参考に。
    ・ソースは本ブランチのものではなく、origin/feature/redmine3 のものを使用。
    ・nokogiriとcapybaraをGemfileからコメントアウトする。
    でok。後はマイグレーションして再起動すれば反映される。

    2

    次に、チケットを作成しようとした時に、
    plugins/redmine_backlogs/lib/backlogs_hooks.rb

    return unless project.module_enabled?('backlogs')
    

    で、projectがnilだと怒られてエラー発生。
    try当て込んだら取り敢えず動いた。

    return unless project.try(:module_enabled?, 'backlogs')
    

    そこから詳しく調べると、
    app/views/issues/new.html.erbで呼ばれていて、それは要するにチケットを作成しようとした時(issues/newが呼ばれた時)の、app/controllers/issues_controller.rbのnewメソッド
    に問題がある。
    それからprojectを入れているのは、newのbefore_actionの中でのbuild_new_issue_from_paramsメソッドの

    @issue.project = @project
    

    それから、@projectを入れているのは、app/controllers/application_controller.rbのfind_optional_projectの、

    @project = Project.find(params[:project_id]) unless params[:project_id].blank?
    

    要するに、パラメータにproject_idが入っていない場合、@projectが空っぽのまま処理が進んでエラーが起きる、という事。
    ただ、どうしてここのproject_idが空っぽなのか? 存在していないプロジェクトに対してチケットを作成しようとした? そもそもトップ画面からのメニューで既にproject_idが入っていなかったからエラーが起きただろうけど、他の部分は動かせていたのは何故……?
    エラー箇所を元に戻してみてもう一度エラーを起こしてみようと思いましたが、その時にはまた何故か正常に動くようになっていて、原因は闇の中に消えてしまいました……。
    ログも削除済みでした……。

    3

    redmine_backlogs/lib/backlogs_setup.rb:234行目でエラー。

    def settings
      SettingProxy.instance.to_h
    end
    

    これだと、文字列=>値のハッシュが作成されるが、これを参照している箇所ではキーを文字列ではなくシンボルで参照しているので、そのように変更する。
    with_indifferent_accessメソッドを使うか、手作業で変えるかはお好みで。

    4

    それから、javascript関連でもエラー。このredmine_backlogsを動かす為に一緒に導入したa_common_libというプラグインにてエラー発生。
    plugins/a_common_libs/assets/javascripts/a_common_lib.js:25にてbuildFilterRowが定義されていないと怒られる。
    えーっと、これはどこのものだ……? と調べた結果、redmine本体のpublic/javascripts/application.jsに存在している事が判明。どういう理由か分からないけれど、このファイルがプラグイン以下で読み込まれていないんだな……。
    色々と調べてみると、
    app/application_helper.rbのjavascript_include_tagsで、pluginに入っているjavascriptファイルは全て取ってきているらしいけれど、public以下のソースを取ってきている様子はどうも見当たらない。
    前のバージョンでは、public以下のソースを取ってきていたんだろうか……と思う。
    で、取り敢えずbuildFilterRow、 それからenableValuesの部分をコピペしてa_common_lib.jsに移植する。それが一番外部に影響が少ないだろうし……。
    ……動いた!
    取り敢えず、これで特に問題はなくなりました。

    +A

    後、他のプラグインを入れた時にそのbacklog関連でエラーが発生したりしましたが、取り敢えず、backlog関連のデータが入っているものを無視するようにすれば、問題はなくなりました。

    Redmineを触ってみての感想

    Railsに触れ始めてもう8ヶ月ほどが経ちましたが、それでもいきなり全く知らないコードを読んでの修正はとても大変でした。
    エラーが起こればコードを追いかけてひたすら原因部分を見つけ出し、応急処置をするように直してを繰り返し……。これ以外のプラグインも入れたりもして、エラーがそれぞれで起きたりもして、それぞれ直す事もしましたが、このredmine_backlogsが一番手間が掛かりました。
    本格的に直そうと思ったら、Redmineにもかなりの時間を割かなければいけないでしょうし、どれだけ時間が掛かるか正直分かりません。
    でも、正常に動くプラグインに関しては本当に数コマンドで新しい機能が使えるようになって、とても使い易いなー、とも思いました。

    ……疲れた。太ってきたけど甘いものが欲しい。