7

ここ数週間、Web サイトの CMS バックエンドを開発してきました。メイン Web サイトに表示されるデータベースと情報を管理できるように、最初にバックエンドのすべてを作成するという考えです。

今のところ、私は現在、すべてのコードを通常の Rails MVC 構造にセットアップしています。したがって、ユーザー管理者は /users で、動画は /videos です。

私の計画は、このコードを取得して、/admin ディレクトリに移動することです。したがって、上記の 2 つのコントローラーには、/admin/users と /admin/videos からアクセスする必要があります。ルオーテ (プレフィックスとして /admin を追加) を行う方法も、ロジックを管理する方法もわかりません。私が考えているのは、/admin ディレクトリにアクセスしたときに、ApplicationControler と対象のコントローラーの間にネストされる追加の「中間」コントローラーをセットアップすることです。このようにして、追加のフラグとオーバーロードされたメソッドを /admin セクションに対してのみ生成できます (これにはフィルターも使用できると思います)。

それが機能する場合、次の問題はビューのロジックを分離することです (ただし、それは単にフォルダーの名前を変更することなどです)。

私はそのようにするか、MVC コードを共有する 2 つの Rails インスタンスを持っていますが (データベースもそうだと思います)、多くの重複エラーが発生するのではないかと心配しています。

これをどのように行うべきかについてのアイデアはありますか?

どうもありがとう!

4

2 に答える 2

6

リソースごとに 2 つのコントローラーを使用してもかまわない場合は、別の "admin" 名前空間を使用できます。管理セクションは公開セクションとはまったく異なるため、この方法が気に入っています。管理コントローラはすべての CRUD アクションを実装しますが、パブリック コントローラは表示アクションとインデックス アクションのみを実装します。

ルート.rb:

map.namespace :admin do |admin|
  admin.resources :users
  admin.resources :videos
end

map.resources :videos, :only => [:index, :show]

コントローラーは次のようになります。

class VideosController < PublicController; end

class Admin::VideosController < Admin::AdminController; end

class PublicController < ApplicationController
  layout 'public'
  before_filter :load_public_menu
end

class Admin::AdminController < ApplicationController
  layout 'admin'
  before_filter :login_required, :load_admin_menu
end

名前空間のコントローラーとビューには、app/controllers および app/views ディレクトリ内に独自のサブディレクトリがあります。ヘルパーを使用する場合は、form_forそのパラメーターを変更する必要があります。

form_for [:admin, @video] do |f|
于 2010-06-03T09:56:13.123 に答える
1

これは、追加のコントローラーなしで比較的簡単に実行できますconfig/routes.rb

# non-admin routes
# your args could include :only => [:index,:show] for the non-admin routes
# if you wanted these to be read-only
map.resources :users,  ...your args..., :requirements => { :is_admin => false }
map.resources :videos, ...your args..., :requirements => { :is_admin => false }
# admin routes
map.resources :users,  ...your args..., :path_prefix => '/admin', \
    :name_prefix => 'admin_', :requirements => { :is_admin => true }
map.resources :videos, ...your args..., :path_prefix => '/admin', \
    :name_prefix => 'admin_', :requirements => { :is_admin => true }

:requirements正規表現ではなく定数を指定したため、ここで実際に行うことは、このルートを介してアクセスしたときに追加することですparams[:is_admin]。したがって、コントローラーでこの値を確認して、異なるビューをレンダリングするか、2 つのビューが類似しているかどうかをビューで確認することができます。false管理者以外のバージョンに要件を含めることが重要です。それ以外の場合は、単に使用できます/users/?is_admin=true

:name_prefixルート名を編集するので、egadmin_video_path(123)video_path(123).

Rails 2.3.5 でテスト済み。他のバージョンは異なる場合があります。RESTful ルートで使用できるオプションの詳細については、ActionController::Resources ドキュメントを参照してください。

于 2010-06-03T08:07:20.440 に答える