torutkのブログ

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

redmine trunkを落としてglossary pluginが動くか試してみる(続々)

redmine trunkを落としてglossary pluginが動くか試してみる(続) - torutkのブログ の続きです。

現時点でのRedmineアップデートへのプラグイン追従の感触

ここまで進めてみて、Redmine 3.4(Rails 4.2)からRedmine 4.0(Rails 5.1)へのアップデートでは、Redmine プラグインの追従が相当に遅れる気配が漂ってきました。これは大変だぞ〜うというのが現時点の感触です。

Rails 5.0では、非互換(DEPRECATION)が警告としてログに出るけど動作はするようです。しかし、RedmineのtrunkはRails 5.1なので非互換はすでに削除されているので実行時エラーとなってしまいます。

そこで、この一連の日記に書いているように、実行時エラーが発生、直して動かして、次の実行時エラーにあってまた直して動かして・・・と泥縄的な対応をしています。

せめて、「Redmine 4.0で動くためのプラグイン修正項目と修正方法はこれだ!」
ガイドがあればいいのですが*1…。

気を取り直して進めていきましょう。

まずは昨日出くわしたエラー before_filterから続けます。

before_filterがない

これは、before_actionに変えればいいとありますが、どう変えるのか分かりませんでした。いろいろ調べたところ、どうやら単純にfilterをactionに変えれるだけでいいようです。

ということで、before_filterをbefore_actionに単純修正して次に進みます。
修正したら、サーバーを再起動します。そうしないと、autoload何とかエラーが出ます。

attr_accessibleがundefined method

次のエラー画面が表示されました。

NoMethodError in GlossaryController#index
undefined method `attr_accessible' for #<Class:0x00007f2cc85bcf88>
Extracted source (around line #14):

  belongs_to :project

  attr_accessible :groupby
  
  def grouping?
    case groupby

対処方法はなんでしょうか?調べていくと「ストロングパラメーター」なるキーワードが出てきました。

見よう見まねで、次の対処をしてみました。

  • GlossaryStyleモデル(app/models/glossary_style.rb)のattr_accessible行を削除
  • GlossaryStylesControllerコントローラ(app/controllers/glossary_styles_controller.rb)にprivateなメソッド追加
  private

    def glossary_style_params
      params.require(:glossary_style).permit(:groupby)
    end

同様に、Termモデル、GlossaryControllerコントローラーにも修正を入れます。

undefined method `acts_as_list'
NoMethodError in Glossary#index

Showing path/to/plugins/redmine_glossary/app/views/glossary_styles/_search.html.erb where line #22 raised:

undefined method `acts_as_list' for #<Class:0x00007f0a751c37a8>

Extracted source (around line #5):
  has_many :terms, :foreign_key => 'category_id', :dependent => :nullify
  
  acts_as_list :scope => :project_id
  
  attr_accessible :name, :project_id, :position

今回確認した要修正事項

  • before_filterは、単純に字面をbefore_actionにする(s/filter/action/g)。
  • attr_accessibleはストロングパラメーターに置き換える。あるいはgemのprotected_attributesを追加する。

https://github.com/rails/protected_attributes

  • acts_as_listを何とかする。

*1:お前が書けばよかろう、と言われかねませんが、RubyRailsもロクすっぽ分からない身なので遅々も進まずです。