2

フレームワークを理解するために、 railstutorial.orgのチュートリアルに取り組み始めまし た。私のコントローラーはまだ巨大ではありませんが、単一責任プリンシパル (SRP)がチュートリアルの範囲を超えているため、チュートリアル全体で適用されていないことがわかります。

私はこの比較的単純なコントローラーをここに持っています。さまざまな問題 (認証や承認など) がこのコントローラーにリークしていることが既に確認できます。このコントローラーには、開始するにはあまりにも多くのアクションが含まれています。これにより、1 つのコントローラーに割り当てられるアクションが多すぎます。これらの問題の 1 つを解決し、非常に興味深いように見える、Rails に焦点を合わせたコントローラーを偶然見つけました。

これは一般的な解決策ですか?それとも、より良い解決策がありますか?

.net の世界では、アスペクト指向プログラミング (AOP)を使用して、よりクリーンな関心の分離 (SoC)を実現する傾向があります。しかし、最近、何人かがFubu Behaviorsと呼ばれる新しいフロント コントローラー フレームワークを作成しました。リクエスト パイプラインのアイデアをうまく​​捉えています。私にとってますます意味のあるもの。

リクエストを処理するために、アクションが実行される前 (場合によっては後) にいくつかの手順を実行する傾向があります。場合によっては、条件付きでリクエストを終了します。ビヘイビアやパイプライン、ロシア人形のパターンなどを使うのが自然に思えます。チェーン内の各リンクが継続または停止のいずれかを担当するようにします。継承は最善の解決策ではないようです。

レールに似たようなものはありますか?レールでは意味がありますか?

おすすめの読み物も大歓迎です!

4

3 に答える 3

2

これらの認証機能を持っていることは、コードの臭いのようなものis_adminであることに同意します。私はそれらを削除し、 CanCancorrect_userと呼ばれる私がよく使用するgemを使用して少しうまく処理します。

これにより、すべての承認ルールをコントローラーからマニフェスト(つまり、アビリティモデル)に移動できます。コントローラーauthorize_resourceは、コントローラーの呼び出しを通じて承認チェックを開始するだけで済みます。ApplicationController次に、 :で単純なリダイレクトを処理できます。

class ApplicationController < ActionController::Base
  rescue_from CanCan::AccessDenied do |exception|
    if current_user
      redirect_to signin_url, :alert => exception.message
    else
      redirect_to root_path, :alert => exception.message
    end
  end
end

それ以外は、すべての呼び出しをbefore_filterに移動し、@user = User.find(params[:id])インデントとアクションの順序(、、、、、、、、)をクリーンアップします。コントローラーは素晴らしくindex、スキニーnewcreateと思います。showeditupdatedestroy

于 2012-10-03T08:16:52.477 に答える
1

正直なところ、承認/認証がモデルの仕事なのかコントローラーの仕事なのか、私にはよくわかりません。人々はこれについてさまざまな答えを出します。グレーゾーンのようなものです。

そこで私は Rails の慣習を採用することを好みます。なぜなら、それらは長年にわたって信頼できることが証明されてきたからです。あなたのコントローラーは私には問題ないように見えますが、太っているとは言いません。もちろん、これらのプライベート メソッドをヘルパーに移動することもできます。

于 2012-10-02T21:09:06.357 に答える
0

あらゆる種類の承認ロジックについては、実際にはコントローラー層からそれを削除し、それを「ポリシー」層に移動します。

この宝石を使用する: https://github.com/NullVoxPopuli/skinny_controllers 2つの追加レイヤーを提供します

  • オペレーション
    • ビジネス ロジックの行き先
  • ポリシー
    • 承認の行き先

Readme の例:

module EventOperations
  class Read < SkinnyControllers::Operation::Base
    def run
      # the business logic here is to only check if we will allow this model
      # to be returned
      model if allowed?
    end
  end
end



class EventPolicy < SkinnyControllers::Policy::Base
  # allowed? from the operation delegates to this method
  # here, you could do whatever logic you need to check if the operation
  # is allowed
  def read?(o = object)
    o.is_accessible_to?(user)
  end
end
于 2016-02-25T21:06:52.883 に答える