복붙노트

[RUBY-ON-RAILS] 기능을 확장 엔진 레일

RUBY-ON-RAILS

기능을 확장 엔진 레일

나는 일부 모델과 컨트롤러를 정의하는 엔진을 가지고있다. 내 응용 프로그램에서 일부 모델 / 컨트롤러의 기능을 확장 할 수 있어야합니다 (예. 방법 추가) 엔진의 원래 모델 / 컨트롤러 기능을 잃어버린없이. 난 당신이 단순히 그러나 그것은 단순히 무시 저와 엔진 컨트롤러 작동하지 않습니다, 자동으로 병합됩니다 응용 프로그램과 레일에 같은 이름을 가진 컨트롤러를 정의 할 필요가 있음을 읽을 모든 곳 (나는 그것이 심지어로드 생각하지 않습니다).

해결법

  1. ==============================

    1.

    require MyEngine::Engine.root.join('app', 'models', 'my_engine', 'my_model')
    

    응용 프로그램의 모델 클래스 정의하기 전에.

  2. ==============================

    2.당신은 lib 디렉토리의 루트 디렉토리에 당신 엔진의 모듈 파일에 다음 줄을 추가 할 수 있습니다 :

    당신은 lib 디렉토리의 루트 디렉토리에 당신 엔진의 모듈 파일에 다음 줄을 추가 할 수 있습니다 :

    def self.root
      File.expand_path(File.dirname(File.dirname(__FILE__)))
    end
    
    def self.models_dir
      "#{root}/app/models"
    end
    
    def self.controllers_dir
      "#{root}/app/controllers"
    end
    

    그럼 당신은 엔진에서 필요한 파일을 필요로하는 주요 응용 프로그램의 기능 (엔진의 응용 프로그램 만들기 사용)가 있습니다. 당신이 패치를 필요로하지 않고, 레일 엔진의 기본 기능을 유지하고 정상적인 루비 상속의 사용을 만들기위한 쉬운 도구를 가지고 있기 때문에 이것은 좋은 것입니다.

    전의:

    #ENGINE Model -
    
    class User < ActiveRecord::Base
      def testing_engine
        puts "Engine Method"  
      end
    end
    
    #MAIN APP Model -
    
    require "#{MyEngine.models_dir}/user"
    class User
      def testing_main_app
        puts "Main App Method"  
      end
    end
    
    #From the Main apps console
    
    user = User.new
    
    puts user.testing_engine #=>  "Engine Method"
    
    puts user.tesing_main_app #=> "Main App Method"
    
  3. ==============================

    3.같은 문제로 다른 사람이 실행 미래의 어떤 시간이 내 문제를 해결 내가 쓴 코드는 그냥 경우 :

    같은 문제로 다른 사람이 실행 미래의 어떤 시간이 내 문제를 해결 내가 쓴 코드는 그냥 경우 :

    module ActiveSupport::Dependencies
      alias_method :require_or_load_without_multiple, :require_or_load
      def require_or_load(file_name, const_path = nil)
        if file_name.starts_with?(RAILS_ROOT + '/app')
          relative_name = file_name.gsub(RAILS_ROOT, '')
          @engine_paths ||= Rails::Initializer.new(Rails.configuration).plugin_loader.engines.collect {|plugin| plugin.directory }
          @engine_paths.each do |path|
            engine_file = File.join(path, relative_name)
            require_or_load_without_multiple(engine_file, const_path) if File.file?(engine_file)
          end
        end
        require_or_load_without_multiple(file_name, const_path)
      end
    end
    

    이것은 자동으로 '응용 프로그램'과 파일 경로 시작하면 응용 프로그램에서 필요로하기 전에 엔진에서 파일이 필요합니다.

  4. ==============================

    4.그건 사실입니다. 처음 발견 된 제어기가 사용될 것이다.

    그건 사실입니다. 처음 발견 된 제어기가 사용될 것이다.

    작동하도록 그래서 두 가지 옵션이 있습니다 :

    도움이 되었기를 바랍니다.

  5. ==============================

    5.당신은 당신의 각 모델에 필요 방지하기 위해 엔진의 부하 순서를 변경할 수 있습니다.

    당신은 당신의 각 모델에 필요 방지하기 위해 엔진의 부하 순서를 변경할 수 있습니다.

    설정 / application.rb이 줄을 추가에서 :

    module MyApp
      class Application
        config.railties_order = [MyEngine::Engine, :main_app, :all]
      end
    end
    

    이 MyEngine에서 모델의 MyApp 전에로드되어 있는지 확인합니다

  6. ==============================

    6.나는 전에 엔진을 사용한 적이 있지만 컨트롤러에서 상속 엔진에서 제공하는 새로운 컨트롤러를 정의 할 수 없습니다

    나는 전에 엔진을 사용한 적이 있지만 컨트롤러에서 상속 엔진에서 제공하는 새로운 컨트롤러를 정의 할 수 없습니다

  7. from https://stackoverflow.com/questions/2964050/rails-engines-extending-functionality by cc-by-sa and MIT license