0

たとえば、コントローラーの1つにこれがあります。

  def show
    case current_user.role
      when 'manager'
       render :text => 'Manager view!'
      when 'admin'
       render :text => 'Admin view!'
    end
  end

もちろん、「render」の代わりにたくさんのコードがあり、すべての停止が非常に速く見えるということです。また、コントローラーには他にもいくつかのアクションがあり、ユーザーロールごとに異なる方法で実行する必要があります。アクションの本文にある種の「ifs」や「cases」を記述せずにリファクタリングするための最良の方法は何ですか?2つのファイルが欲しいのですが、ユーザーロールごとに1つずつです。または少なくとも2つの異なるアクション。

4

1 に答える 1

1

2 つのバリエーションが大きく異なり、同じコントローラーから呼び出す必要がある場合は、around_filterを使用して、controller.action_name を同じベースから継承する 2 つのクラスのいずれかにディスパッチできます。

2 つのバリエーションがフォークを必要とするほど異なっていない場合、ifs は問題ないはずです...

ディスパッチの場合、基本クラスから継承する単なるジェネリック クラスである可能性があります。ロールに基づいて適切なオブジェクトを作成し、最後にオブジェクトで send(“#{action}”) を作成するスイッチをフィルターに含めることができます。バリエーションが非常に異なるため、2つの派生クラスに値する場合にのみそうします。

汎用クラスとは別に、render_component メソッドを使用して便利なコンポーネントを使用することもできます。ほとんどの場合、コンポーネント コントローラへのディスパッチのオーバーヘッドは無視できる程度です。(これは、.net のサーバー側転送 (Server.Transfer) のようなものです。)

于 2009-12-25T03:13:21.937 に答える