[Rails]Administrateでメインアプリで使っていたヘルパーメソッドを動作させる方法


困ったこと、やりたいこと

\\\メインアプリのヘルパーメソッドが使えない///

Railsアプリで管理画面を作成するために、Administrateというgemを使用した時のことです。
メインアプリのビューで使うためにhelperファイルに定義したhelperメソッドを、admin以下のビューでも使おうとしたところ、下記のエラーが…

image_present?は、メインアプリのビューで使用しているヘルパーメソッド(自分でhelpers/shops_helper.rbに定義したもの)です。
メインアプリではNoMethodErrorにならないのに…どうすればいいの???

環境

  • Ruby 2.5.1
  • Rails 5.0.7.2
  • Administrate 0.14.0

結論

1. config/application.rbファイルに、下記の設定を記述する。
2. アプリケーション(サーバー)を再起動する

以上。簡単でした笑

config/application.rb
module Hoge
  class Application < Rails::Application
    # 他のconfigが書かれてるかも

    # ここから
    config.to_prepare do
      Administrate::ApplicationController.helper Hoge::Application.helpers
    end
    # ここまで
  end
end

Hogeはアプリ名です。通常ならば、1行目のmoduleの後ろにrails newした時のアプリ名が記載されているはずです。

Administrate::ApplicationController.helper Hoge::Application.helpers

Hogeの部分を、ご自身のアプリ名に置き換えてください。

しっかりGitHubのIssuesに挙げられていて、解決済みだった

Best way to include main app helper modules in administrate? #334

余談

参考記事に挙げたGitHubのIssuesを見ていると、他の方法もあるよう。

こちらの方法は、
1. helpersディレクトリの下にadministrateディレクトリを作成
2. そこにapplication_helper.rbファイルを作成
3. そこにヘルパーメソッドを再度定義する
という方法のようです。

試しにやってみた

helpers/administrate/application_helper.rb
module Administrate::ApplicationHelper
  def image_present?(shop)
    if shop.shop_images.present?
      image_tag "#{shop.shop_images[0].shop_image}", class: 'top-cover-img shop-img'
    else
      image_tag asset_path('no-image.png'), class: 'top-cover-img shop-img'
    end
  end
end

ポイントは、moduleの宣言の際に、クラスの継承?(Administrate::ApplicationHelper)を記述することだそうです。
これがないとRouting Errorになります。

実現できるが、DRY原則に反する

一応上記の方法でも実現できましたが、同じヘルパーメソッドを2回定義することになるので、DRY原則に反するなと思いました。

無駄なファイルも作成しなくていいので、冒頭の方法をおすすめします。