[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.helpersHoge 부분을 자신의 앱 이름으로 바꿉니다.

    확실히 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 원칙에 반하지 말라고 생각했습니다.

    쓸데없는 파일도 작성하지 않아도 되므로, 시작의 방법을 추천합니다.

    좋은 웹페이지 즐겨찾기