2010-12-02 2 views
10

두 개의 다른 모델을 생성하는 레일 3 생성기를 작성하고 있습니다.레일 3 생성기에서 태스크를 두 번 이상 호출하십시오.

def my_generator_task 
    invoke "model", ["foo"] 
    invoke "model", ["bar"] 
end 

문제 Thor invoke method 한 번만 작업을 호출하므로 "모델"작업에 두 번째 호출은 결코 발생하지 않고 있다는 것입니다 "바"여기에 내가 할 노력하고있어 매우 간단한 예입니다 모델이 생성되지 않습니다. 누구든지 발전기로 "레일 파괴"를 실행할 수있는 능력을 망가 뜨리지 않는 방식으로이를 달성하는 우아한 방법을 알고 있습니까? 당신은 의존성 관리하지 않고 작업을 호출 할 경우

토르와

답변

2

, 당신은 직접 호출 : 경우

model(foo) 
model(bar 
1

을하면 즉, 토르 : 그룹에서 서브 클래스 발전기를 실행하려면 단지 Thor 작업 하나만 있으면 다른 파일에서 전체 생성기를 호출 할 수 있습니다.

Rails::Generators.invoke("my_generator", my_generator_args) 

railties의 발전기 모듈 generators.rb은/레일 새 인스턴스를 만들 것, 그래서 작업이 이미 호출 된 생각하지 않습니다. 즉 위의 행을 원하는만큼 반복 할 수 있으며 매번 실행됩니다.

1

나는 우아한 방법을 모른다. this talk, 나는 두 번 controller 발전기를 호출하는 사용자 정의 발생기의 예를 준 - 슬라이드 43

우아 방법은 토르의 @_invocations 배열로 가서 다시 실행하기 전에 첫 번째 실행의 작업을 삭제하는 것입니다을 확인하십시오.

+0

+1 - 호출'후 : [1]하기 remov .pop' _invocations.first 방법 [인수] @ '사용 options' e 호출 목록에서 가장 최근에 호출 된 태스크. – Andy

3

한 번 더 생각이 방법은 마이그레이션하지 않고 여러 모델 생성기를 실행하는 것도 가능

Rails::Generators.invoke("active_record:model", ["foo", "--no-migration" ]) 
Rails::Generators.invoke("active_record:model", ["bar", "--no-migration" ]) 
0

"행동"(bonyiii의 예를 사용하여) 도움이 될 수 있습니다라는 매크로 방법이있다 :

def generate_model 
    if behavior == :invoke 
    Rails::Generators.invoke("active_record:model", ["foo", "--no-migration"], behavior: behavior) 
    Rails::Generators.invoke("active_record:model", ["bar", "--no-migration"], behavior: behavior) 
    else # behavior == :revoke 
    Rails::Generators.invoke("active_record:model", ["foo", "--no-migration"], behavior: :revoke) 
    Rails::Generators.invoke("active_record:model", ["bar", "--no-migration"], behavior: :revoke) 
    end 
end 

하거나 :

def generate_model 
    Rails::Generators.invoke("active_record:model", ["foo", "--no-migration"], behavior: behavior) 
    Rails::Generators.invoke("active_record:model", ["bar", "--no-migration"], behavior: behavior) 
end 
관련 문제