6

これは奇妙に聞こえるかもしれませんが、聞いてください...他のコントローラーの 1 つに対して POST 要求と同等のものを作成できる必要があります。はSimpleController基本的に、より冗長なコントローラーの単純化されたバージョンです。どうすればこれを適切に行うことができますか?

class VerboseController < ApplicationController
  def create
    # lots of required params
  end
end

class SimpleController < ApplicationController
  def create
    # prepare the params required for VerboseController.create
    # now call the VerboseController.create with the new params
  end
end

考えすぎかもしれませんが、やり方がわかりません。

4

2 に答える 2

7

Railsアプリ(または同じmodel-adapter-viewパターンに従うWebアプリ)でのコントローラー間通信は、積極的に避ける必要があります。そうするように誘惑された場合は、アプリが構築されているパターンとフレームワークと戦っていて、ロジックに依存していることは、アプリケーションの間違ったレイヤーに実装されていることを示していると考えてください。

@ismaelgaがコメントで示唆したように; 両方のコントローラーは、この共有動作を処理し、コントローラーを「スキニー」に保つために、いくつかの共通コンポーネントを呼び出す必要があります。Railsでは、これはモデルオブジェクトのメソッドであることが多く、特にこの場合は、ある種の作成動作について心配しているようです。

于 2012-05-14T23:54:19.713 に答える
3

あなたはこれをするべきではありません。モデルを作成していますか?その場合、モデルに 2 つのクラス メソッドがあると、はるかに優れたものになります。また、コードをより適切に分離します。その後、コントローラーだけでなく、バ​​ックグラウンド ジョブ (など) で将来的にメソッドを使用できます。

たとえば、Person を作成する場合:

class VerboseController < ApplicationController
  def create
    Person.verbose_create(params)
  end
end

class SimpleController < ApplicationController
  def create
    Person.simple_create(params)
  end
end

次に、Person-モデルでは、次のようになります。

class Person
  def self.verbose_create(options)
    # ... do the creating stuff here
  end

  def self.simple_create(options)
    # Prepare the options as you were trying to do in the controller...
    prepared_options = options.merge(some: "option")
    # ... and pass them to the verbose_create method
    verbose_create(prepared_options)
  end
end

これが少し役立つことを願っています。:-)

于 2012-05-14T23:55:42.890 に答える