LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-21

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

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

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

スクリーンショット 2020-07-21 21.00.03.png

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
スクリーンショット 2020-07-21 20.51.34.png

余談

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

スクリーンショット 2020-07-21 20.52.13.png

こちらの方法は、
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になります。
スクリーンショット 2020-07-21 21.10.13.png

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0