torutkのブログ

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

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

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

Glossary PluginのRedmine 4.0対応難航中

もう、「RE:ゼロから始めるGlossary Plugin開発」にタイトル変えて一から作っていきたくなる心境ですが、それも茨の道なので(幾度か頓挫)、もうしばらく現行のGlossary Pluginの対応を進めてみたいと思います。

acts_as_list がない件の調査

Ruby on Rails 1.xの頃にはacts_as_listがあって、それ以降はなくなったといった記述をググっているときに見かけたのですが、URLメモ忘れています。

で、Redmine 3.4でどうなっているか調べると、Redmine本体の次のディレクトリにacts_as_listのコードがありました。

<Redmineインストールディレクトリ>/lib/plugins/acts_as_list/

では、Redmineの最新開発版(trunk)を見てみると、見当たりません。lib/pluginsの下は次の様になっていました。

acts_as_activity_provider  acts_as_customizable  acts_as_searchable  acts_as_watchable  open_id_authentication
acts_as_attachable         acts_as_event         acts_as_tree        gravatar

acts_as_listとatcs_as_versionedの2つが消えています。

対策

一から作るのは大変そうなので、GlossaryプラグインディレクトリにGemfileを作成し、次を記述します。

gem 'acts_as_list'

Redmineルートディレクトリで次を実行します。

$ bundle install
  :
Fetching acts_as_list 0.9.11
Installing acts_as_list 0.9.11
  :

acts_as_listのgemがインストールされます。

サーバーを実行すると、一歩前進することができました。

term_category.rb の attr_accessible

まだ未対処だったので対処が必要です。

term_category.rb から attr_accessibleを削除します。
次に、term_categories_controller.rb にストロングパラメータのコード(メソッド)を追記し、そのメソッドを呼び出す場所を探しました。しかし、term_categories_controller.rb を見ると、TermCategory.where あるいは TermCategory.find_by で検索しているコードはありますが、TermCategoryをnewしているコードが見当たりません。

どうしたものかと、とりあえずサーバーを再実行し様子を見てみます。プロジェクトメニューの[用語集]をクリックすると、めでたく用語集画面が表示されました。続いて、用語定義を作っている途中、カテゴリの作成でエラーとなりました。

ActiveModel::ForbiddenAttributesError in GlossaryController#add_term_category
ActiveModel::ForbiddenAttributesError
Extracted source (around line #121):
  def add_term_category
    @category = TermCategory.new(params[:category])
    @category.project_id = @project.id
  :
plugins/redmine_glossary/app/controllers/glossary_controller.rb:121:in `add_term_category'

先ほど、term_categories_controller.rbにはTermCategory.newが見当たらなかったのですが、glossary_controller.rbに記載されていたのですね。うーむ、ストロングパラメータのメソッドをterm_categories_controller.rbからglossary_controller.rbに移動して、newの際に呼び出すように修正します。

が、上述のコードでTermCategoryをnewするときに渡されるパラメータの中身はproject_idだけになっている模様。ストロングパラメータのメソッドの中で
require(:category)としてもActionController::ParameterMissing (param is missing or the value is empty: category)とエラーになってしまいました。

このあたりでしっかりコントローラーに渡されるパラメータ(params)の中身と、ストロングパラメータの仕組みについて理解をしないと対処が困難になりました。

本日確認した要修正事項

  • acts_as_listの対応は、プラグインのGemfileにacts_as_listを追加する
  • TermCategoryのインスタンス生成(データベースへの書き込み)はTermCategoriesControllerではなく、GlossaryControllerにあるのでストロングパラメータの記述をどこに書くか、また渡されるパラメータが何かを確認する必要あり