2

私のモデルには、ユーザーとプロジェクトの参照を含む費用が含まれています..

class Expense < ActiveRecord::Base
     attr_accessible :amount, :expense_date, :description, :project_id, :user_id

      belongs_to :project
      belongs_to :user
end

ExpensesController は、経費の基本的な CRUD 操作を処理します。

私は今、この同じページの管理者用バージョン、できれば新しいビューを作成する必要があります。これには、ユーザー別、プロジェクト別などのデータのさまざまなビューを含めることができ、ユーザーが編集できないデータも編集できます。

私の質問は次のとおりです。データの管理パースペクティブを処理するために2番目のコントローラーを構築しますか?または、元のビューとフォームを検出するためにすべてのメソッド内に条件を設定し、それらを所属する場所にリダイレクトする条件を設定しますか? ?

2 番目のコントローラーを作成する場合、どのコントローラーに移動するかを認識できるように、form_for を適切にセットアップするにはどうすればよいですか?

ありがとう!

PS - Rails アプリを適切に組み立てる方法についての本を誰かが持っている場合、私はアリの部分を知っているように感じますが、全体像の実装に行き詰まっています。私は Michael Hartl のガイドで Rails を学びました。それ以前は PHP 開発者でした。

4

3 に答える 3

3

私見ですが、セキュリティがアプリにとって大きな懸念事項である場合は、管理者の名前空間と個別のコントローラーを使用することが、ギャップを残さないようにするための最良の方法です。それはまた、より単純でストレスが少ないだけです。

私は次のようなディレクトリ構造になります:

/app/controllers/application_controller.rb
/app/controllers/admin_controller.rb - inherits from application_controller
/app/controllers/expenses_controller.rb - non-admin, inherits from application_controller
/app/controllers/admin/expenses_controller.rb - inherits from admin_controller

あなたの見解は同様に分離/複製されます:

/app/views/expenses/* - non-admin expenses views
/app/views/admin/expenses/* - admin expenses views

application_controllerでは、Deviseメソッドをauthenticate_userに、CanCanメソッドをcheck_authorizationに配置します(コントローラーアクションのある時点で承認がチェックされていない場合は例外がスローされます)。admin_controllerには、ユーザーが管理者であることを確認するためのより厳密なフィルターがあります。次に、特定のコントローラーとそのアクションをさらに細かく調整できます。

もちろん、各コントローラーは実際に必要なアクションを定義するだけでよく、ビューを複製する必要はありません。たぶん、管理者以外のexpenses_controllerにはindex、show、new、createがあり、adminには編集、更新、破棄しかありません。次に、「show」ビューには、ユーザーが管理者である場合に「edit」アクションへのリンクを追加するコードがあります。

編集-ルート

上記の例では、routes.rbは次のようになります。

resources :expenses, :only => [:index, :show, :new, :create]

namespace :admin do
  resources :expenses, :only => [:edit, :update, :destroy]
end

したがってexpenses_path()、インデックスとexpense_path(foo)ショーに引き続き使用します。ただし、管理ページのフォームはに投稿されadmin_expense_path(@expense)ます。

于 2012-11-25T23:07:06.193 に答える
2

別のコントローラーを追加したい場合は、モジュールに共通のコードを入れて、各コントローラーにインポートすることをお勧めします。各コントローラーには、適切な権限をチェックするための適切なビフォアフィルターもあります。

ただし、コードの重複や混乱を回避できると思うので、1つのコントローラーと1つのビューのセットを使用することをお勧めします。ユーザーをローカル変数としてビューに渡し、form_forのURLを決定する必要がある場合、または一部を非表示にするか表示するかを決定する必要がある場合は、管理者権限を確認してください。

ビューが大幅に異なる場合は、コントローラーで管理者権限を確認し、ユーザービューまたは管理者ビューのいずれかをレンダリングします。

ビューの管理部分用に特別なパーシャルを作成し、それをビューにレンダリングするかどうかを決定して、パラメータで適切なデータを送信することもできます。

于 2012-11-25T22:20:59.070 に答える
1

Devise gem を認証に使用できます。アプリケーションの管理部分のために、ある種の「名前空間」を作成できます。

私の意見では、別のコントローラーを作成するかどうかは、管理者がアクセスするビューとアクションの数によって異なります。

form_for アクションに関する疑いについては、form_for パラメータで設定したルートとパスによって管理されます。

于 2012-11-25T22:31:38.673 に答える