5

Rails 3.2 と devise 2.1 を使用してマルチサイト CMS を作成しています

要件

  • サイト ベースの Basecamp サブドメイン。
  • 3つの「ユーザー」モデルがあります。1. 管理者 (スーパーユーザー) 2. 作成者 (それぞれがサブドメインに独自のサイトを持っています) & 購読者 (サイトを読んでください)。
  • 作成者: 登録は通常のユーザー名とパスワードの組み合わせですが、管理者による承認が必要です。登録フォームにはサブドメイン フィールドがあります。
  • サブスクライバー: 登録は招待メールによって行われます。
  • 別のログインと登録フォームが必要

可能な解決策

私は検索していくつかの解決策を見つけました

  • 3 デバイスでモデルを分離:
$ rails generate devise admin 
$ rails generate devise author
$ rails generate devise subscriber

しかし、これにより次のエラーが発生します

$ rails generate devise author /home/gaurish/.rvm/gems/ruby-1.9.3-p286-perf/gems/devise-2.1.2/lib/devise/rails/routes.rb:443:in 'raise_no_devise_method_error!': Admin does not respond to 'devise' method. This usually means you haven't loaded your ORM file or it's being loaded too late. To fix it, be sure to require 'devise/orm/YOUR_ORM' inside 'config/initializers/devise.rb' or before your application definition in 'config/application.rb' (RuntimeError)

  • STI: データベース内の単一のテーブルで、ユーザー タイプごとにモデルを作成する

     class Admin < User; end
     class Author < User; end
     class Subscriber < User; end

ここでは、これがさまざまなログイン/登録ワークフローをどのように処理するかわかりません. サブスクライバーの例招待状の作成にdevise_invitableを使用する予定です。管理者は、作成者や購読者とは異なり、サブドメインに基づいてスコープを設定する必要はありません。

これは複雑に見えますか?うまく説明できてよかったです。

4

2 に答える 2

4

この機能を構築するために 3 つの個別のモデルを用意する必要はありません。注目したいのは、1 つのユーザー モデルに適用されるロールの概念です。

Rolify と呼ばれるこの機能を提供する Gem があり、https://github.com/EppO/rolifyで見つけることができます。

これにより、1 つの既存のモデルから、どのユーザーがどの役割に属しているかを指定し、必要に応じて変更することができます。

ユーザー モデルにロールをアタッチしたら、Devise の登録コントローラーをオーバーライドして、ロールを検出し、さまざまなテンプレートなどをレンダリングできます。これを行うには、次のようにします。

  1. rails generate devise:viewsDevise gem からビューをプロジェクトにアンパックするために実行します
  2. 独自の登録コントローラーを作成します。

    # app/controllers/registrations_controller.rb
    class RegistrationsController < Devise::RegistrationsController
      def new
        super
        # Add logic here to detect Role and display different forms
      end
    
      def create
        super
      end
    
      def update
        super
      end
    end 
    
  3. Routes.rb ファイルに正しい設定を追加して、Devise に新しいコントローラーを使用するように指示します。

    # app/config/routes.rb
    devise_for :users, :controllers => {:registrations => "registrations"}
    
于 2012-12-28T17:38:32.007 に答える