困ったこと、やりたいこと
\\\メインアプリのヘルパーメソッドが使えない///
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. アプリケーション(サーバー)を再起動する
以上。簡単でした笑
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を見ていると、他の方法もあるよう。
こちらの方法は、
-
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原則に反するなと思いました。
無駄なファイルも作成しなくていいので、冒頭の方法をおすすめします。