10

2 つの異なるモデルを作成する Rails 3 ジェネレーターを作成しています。これは私がやろうとしていることの非常に単純化された例です:

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

問題は、Thor 呼び出しメソッドがタスクを 1 回だけ呼び出すため、「モデル」タスクへの 2 回目の呼び出しが発生せず、「バー」モデルが作成されないことです。できればジェネレーターで「レール破壊」を実行する機能を壊さない方法で、これを達成するエレガントな方法を知っている人はいますか?

4

5 に答える 5

3

もう1つ考えてみましょう。この方法では、移行せずに複数のモデルジェネレーターを実行することもできます。

Rails::Generators.invoke("active_record:model", ["foo", "--no-migration" ])
Rails::Generators.invoke("active_record:model", ["bar", "--no-migration" ])
于 2011-05-03T07:02:48.763 に答える
2

Thorを使用すると、依存関係管理なしでタスクを呼び出す場合は、直接呼び出すだけです。

model(foo)
model(bar
于 2011-02-05T07:17:56.040 に答える
1

Thor::Group からサブクラス化されたジェネレーターを実行したい場合、つまり単一の Thor タスクではなく、別のファイルからジェネレーター全体を呼び出すことができます。

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

railties/rails の generators モジュール generators.rb は新しいインスタンスを作成しているようで、タスクが既に呼び出されているとは考えていません。これは、上記の行を何度でも繰り返すことができ、毎回実行されることを意味します。

于 2011-02-23T23:51:32.827 に答える
1

私はそれを行うエレガントな方法を知りません。この講演では、ジェネレーターを 2 回呼び出すカスタム ジェネレーターの例を示しましたcontroller- スライド 43 をご覧ください。

洗練されていない方法は、Thor の@_invocations配列に入り、最初の実行のタスクを削除してから再度実行することです。

于 2011-02-23T23:57:06.630 に答える
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
于 2013-07-29T10:43:15.177 に答える