Discourse 플러그인과 Rails 6 config/initializers 관련 질문

이제 훨씬 이해가 됩니다. 저는 코드 리로딩 대신 디스코어 코어 작업을 할 때도 서버를 재시작하는 습관이 있어서 문제가 발생하지 않았던 것 같습니다.

최근에 제가 한 일은, 여러분 중 많은 분들이 이미Rails 앱 구축에 있어 초급 전문가가 아니지만, Rails를 재시작하지 않고 다시 로드해야 할 설정 변수를 계획하고 해당 코드를 ApplicationController로 옮기는 것이었습니다.

더 나은 방법이 있을 것이라고 확신하지만, 이 특정 Rails 구현체는 백오피스 앱이고 성능 문제가 없기 때문에:

class ApplicationController < ActionController::Base

  before_action  :set_site_settings

  private

  def set_site_settings
    @use_custom_date_format = Sitesetting.where(name: "custom_date_format").pluck(:value).last
  end

end

더 나은 방법을 찾게 된다면 기쁠 것입니다!

그러나 이 코드를 Rails 초기화 프로그램(initializers)에서移出하는 것은, 이제 기본 Rails MVC CRUD 스캐폴드를 사용하여 DB에 저장되므로 사용자가 이 사이트 설정을 쉽게 변경할 수 있게 해줍니다.

Rails에서 SQL 캐싱은 액션(action) 범위 밖에서는 작동하지 않으므로, 언젠가는 이 코드를 캐시로 옮기는 법을 배우고, Rails 컨트롤러가 액션을 처리할 때(예: 사이트 설정 컨트롤러에서 새 값을 저장하는 등) 캐시가 비워지도록 확인해야 합니다.

어쨌든, 이 클라이언트 Rails 앱(백오피스 전용)은 고성능 용도로 사용되지 않으므로, 애플리케이션 컨트롤러에 쿼리를 추가하는 것이 괜찮고, 프로젝트 내에서 해당 사이트 설정이 필요한 각 컨트롤러에서 이 코드를 반복하는 것을 피할 수 있습니다.

@fzngagan 님, 저는 확실히 "rubyist"는 아니며 대부분의 Discourse 플러그인 개발자보다 Rails에 대한 경험이 훨씬 적습니다. 하지만 그렇다고 해서: 만약 프로덕션(또는 개발) 환경에서 애플리케이션을 재시작하지 않고 플러그인 파일을 리로드해야 한다면, 앞으로 다음과 같은 방법으로 해결할 수 있을 것입니다:

after_initialize do

  # 아래 코드를 원하는 컨트롤러로 변경하거나
  # 필요 시 application controller를 사용하세요

  ApplicationController.class_eval do
    before_action :do_my_stuff

    def do_my_stuff
      load File.open(FAIZAANS_FAV_FILE)
    end
  end
end

이렇게 하면 예상대로 파일이 리로드됩니다.

현재 저는 아래처럼 플러그인에서 이 방법을 사용하고 있으며, 예상대로 잘 작동합니다:

after_initialize do

  Admin::AdminController.class_eval do
    before_action :do_neo_plugin_info

    def do_neo_plugin_info
      load File.open(PLUGIN_LOGIC)
    end
  end
end

현재 저는 때때로 작업하고 있는 플러그인에서 이 코드를 사용 중인데, 이 플러그인은 ENV["DATA_NAME"]에서 파싱된 컨테이너 이름과 df 및 grep을 사용하여 일부 시스템 코드에서 파싱된 디스크 공간을 표시합니다.

관리자 뷰에서:

aforementioned 대로, 저는 어떤 의미에서도 Rubyist가 아닙니다. 하지만 이 방법은 저에게는 잘 작동합니다.

instance.rb의 플러그인 코드를 확인하고 여러 가지 시행착오를 거친 후, 위에서 언급한 class_eval 코드를 사용하기로 결정했습니다. 이것이 가장 권장되는 방식은 아닐 수 있지만, 제 경우에는 확실히 작동합니다.

예를 들어, 많은 Discourse 백업을 삭제한 후 페이지를 리로드하면 디스크 공간 표시기가 예상대로 변경됩니다.