1

레일 아래에 중첩 네임 스페이스가있는 엔진을 생성하는 방법을 찾을 수 없습니다. 내가 할 때마다 기본적으로 생성 된 파일을 손으로 편집하고 이동해야합니다. 레일에 중첩 된 네임 스페이스를 실제로 지원하지 않습니까? 가능성은 낮습니다. 회사에서 중첩 네임 스페이스가있는 레일 4 엔진

우리는이 같은 모든 네임 스페이스 : 회사 명 : SerivceName :: 모듈 그래서

을 나는 서비스 1 작업 및 고객 지원에 사용하는 응용 프로그램에 통합 될 엔진을 만들고있을 때 고객의 요청에 따라 해당 서비스의 사용자 및 데이터와 놀고 싶습니다. 아래에 해당 엔진을 만들고 싶습니다. CompanyName :: Serive1 :: CustomerSupport

그러나 레일은 그렇게 할 수없는 것 같습니다. rails plugin new a::b::blah 사용

  • 은 허용되지 않는다 : rails plugin new a/b/blah 지정

    akovanm0:test avandra$ rails plugin new a::b::blah -T --dummy-path=spec/dummy --mountable --full --mountable

    Invalid plugin name a::b::blah. Please give a name which use only alphabetic or numeric or "_" characters.

  • 는 엔진을 생성하지만 rails plugin new a_b_blah 생성 지정 rails plugin new blah

  • 같은 출력이 실내 이름 공간이 아닌 문자 그대로의 이름 인 a_b_blah를 사용하십시오.

는 내가 달성하고자하는 것은 누구의 컨트롤러, 모델 및 조회 수 a::b::blah 네임 스페이스에서 생성되는 엔진이며, 같은 방식으로 장착입니다 (실제 이름은 ABBlah에 낙타 표기법입니다). 나는 생성 된 모든 컨트롤러가 app/controllers/a/b/blah이되고, 모델은 app/models/a/b/blah이됩니다.

이 방법이 있습니까?

답변

2

탑재 가능한 옵션이 활성화 된 엔진을 작성해야합니다 (예 : rails plugin new engine_name --mountable). 엔진 네임 스페이스를 분리하기 위해 lib/engine_name/engine.rb에 isolate_namespace EngineName 메서드 호출을 추가합니다.

+0

내가 알고,하지만 당신은 다음 모델을 만들어 이런 식으로 발생하는 경우, 그것을 위해 다음 을 중첩 된 네임 스페이스 –

+0

OKK를 생성 할 수있는 방법이 없습니다 당신의 자신의 발전기를 만들고, 는'g 모델 레일 a/b/blah' 컨트롤러와 동일 함, 'rails g 컨트롤러 a/b/blah' –

+1

내 엔진의 이름을 :: b :: blah가 아닌 모델 및 컨트롤러 등으로 지정하고 싶습니다. –

2

난 당신이 편집이

:(그렇게 할 수 없다고 생각 : 대답 하단에 봐, 난 그냥 그것을 할 레일 플러그인 발전기를 수정 한 :

당신은주의 깊게 보면 소스 (https://github.com/rails/rails/blob/5f07366bed77116dbfbb5b98d1cdf6c61b3dfc9b/railties/lib/rails/generators/rails/plugin/plugin_generator.rb#L299)를 보면 플러그인 이름이 대상 폴더의 기본 이름임을 알 수 있습니다.

def original_name 
    @original_name ||= File.basename(destination_root) 
    end 

그래서 당신은 다음 플러그인이 현재 폴더에 A/B/C의 하위 폴더에 생성됩니다 rails plugin new a/b/c 쓰기하지만 이름이 될 것입니다 경우 단지 C :(

는 해당 ORIGINAL_NAME의 메소드를 오버라이드 (override)하는 경우 a/b/c를 원하는대로 반환하면 형식 이름의 유효성을 검사하고 "영문자 또는 숫자 또는 _ 문자 만 허용합니다"라는 valid_const? 방법 (https://github.com/rails/rails/blob/5f07366bed77116dbfbb5b98d1cdf6c61b3dfc9b/railties/lib/rails/generators/rails/plugin/plugin_generator.rb#L307)과 모듈을 만드는 템플릿을 모두 싸워야합니다.내가 대신 내 네임 스페이스 플러그인 :(

편집을위한 플러그인 템플릿 (http://edgeguides.rubyonrails.org/rails_application_templates.html)를 사용하여 생각하고 있어요

def valid_const? 
    if original_name =~ /[^0-9a-zA-Z_]+/ 
     raise Error, "Invalid plugin name #{original_name}. Please give a name which use only alphabetic or numeric or \"_\" characters." 
    elsif camelized =~ /^\d/ 
     raise Error, "Invalid plugin name #{original_name}. Please give a name which does not start with numbers." 
    elsif RESERVED_NAMES.include?(name) 
     raise Error, "Invalid plugin name #{original_name}. Please give a name which does not match one of the reserved rails words." 
    elsif Object.const_defined?(camelized) 
     raise Error, "Invalid plugin name #{original_name}, constant #{camelized} is already in use. Please choose another plugin name." 
    end 
    end 

가 :. 당신이 싸워야 할 것입니다 무슨 방법에 대해 거짓말 그것은 이름 방법이 아니다, 그건 템플릿

EDIT (II)이 :. 내가 그렇게 중첩 된 네임 스페이스가 허용 된 plugin_new 폴더를 수정 한 당신은 여기에서있다 : 나는 어떤 의견 :

감사하겠습니다

+0

당신이 이것을 풀 요구로 만들어야한다고 생각합니다. 어쩌면 업스트림에 수용 될 것이고, 모두가 혜택을 얻을 수있을 것입니다. –

+0

나는 그것에 대해 생각하고 있었지만, 단지 그것을 나의 경우에 사용했고 그것이 어떤 종류인지는 모릅니다. 원하지 않는 부작용. 그것이 내가 피드백을 요구하는 이유입니다. 하지만 좋은 생각입니다. 나는 풀 요청을 보내고 Rails 사람들이 그것을 받아들이는지 확인합니다. 감사! PR에 – Brenes

+0

링크가 있습니까? – jsharpe