3

序文: Rails コミュニティの出身者であれば、サーバー側でモデル アクションの承認を宣言する cancan に精通していると思われます。すなわち。can?(:read, プロジェクト)

背景: しかし、フロントエンドの UI レイヤーでは、ユーザーに表示されるものとユーザーが許可されていることを処理するために同じタイプの抽象化を提供するものは見つかりませんでした (明らかに常にバックエンド認証レイヤーも持っています)。たとえば、ユーザーにボタンを表示しますか? 「contenteditable」要素属性を含めますか? ユーザーが「いいね」をクリックした場合、それを登録しようとしますか、それともログイン ダイアログ ボックスを表示しますか?

質問: この種の UI の問題を処理するためのフレームワーク/ツール/ライブラリ/ベスト プラクティスを知っている人はいますか?

フォローアップ: 質問はビューまたはテンプレートで評価されますか? これはテンプレート言語の機能ですか、それともテンプレートに渡すブール変数のセットですか?

余談ですが、メソッド シグネチャが App.can('like',project,user) のようなもので、プロジェクトとユーザーが BB モデル オブジェクトである cancan 模倣ツールのアイデアがありました。ただし、問題は、ユーザーが特定のオブジェクトに対して実行できるさまざまなアクションの数である可能性があります。すなわち。プロジェクトのように、プロジェクトを編集し、プロジェクトにコメントし、友人をプロジェクトに招待するなどです。これらのいくつかは RESTful アクションに減らすことができますが、UI がより多くの種類のアクションを提示することにほとんどの人は同意すると思います。

4

2 に答える 2

2

私たちのプロジェクトでは、ユーザーに与えられた権限に従ってページ内のすべてを表示および非表示にする必要があるという同じ状況がありました。これが私が思いついた解決策です。

最初にユーザーにアクセス許可を保存し、クライアント側にロードする必要があります。次に、次のようにそれらを確認できます

1-ベースビューで「filterByPermission」関数を宣言します(すべてのビューはこれを継承する必要があります)

class SampleProject.Views.BaseView extends Backbone.View

  filterByPermission:=>
    #these views will be removed incase user does not have a specific permission
    if @views_permissions?
      for permission, selector of @views_permissions
        unless SampleProject.current_user.has_permission permission
          @$(selector).remove()

    #these views will be removed incase user has a specific permission
    if @remove_views_permissions?
      for permission, selector of @remove_views_permissions
        if SampleProject.current_user.has_permission permission
          @$(selector).remove()

2-次に、ベースビューを継承し、「views_permissions」でアクセス許可を定義する別のビューに入ることができます(イベントハッシュに似たもの)

class SampleProject.Views.UsersIndex extends SampleProject.Views.BaseView
  views_permissions:
    "create_users":  "#js_create_user_li, #new_user_modal"
    "import_users": "#js_import_btn_li, #import_form_li"
    "edit_users"  :  "#edit_user_modal"
    "delete_users"  :  "#js_delete_user_li, .js-user-selector-header"

  render:=>
    #render your view here
    @filterByPermission()

ビューをレンダリングした後、@filterByPermission() を 3 回呼び出します。

このようにして、コード全体に if ステートメントを追加することなく、パーミッションに従ってビューを制御する場所が 1 つあります。

于 2014-03-30T16:15:18.320 に答える