3

私はこれに対する答えを高低で検索しましたが、不足しています。

Postgres スキーマに基づいて、Rails 4、Devise、および Apartment を使用してマルチテナント アプリケーションを構築しようとしています。私のローカル Postgres サーバーには、PostgresApp を使用することにしました。Go Rails マルチテナント ガイドに従い、このエラーが表示され始めたときにそのセットアップ (テナントごとに 1 人のユーザー) が機能していました。これは昨日、Devise の Invitable 拡張機能をインストールしようとしているときにローカルで表示され始めましたが、何が起こっているのかについての手がかりが見つからないようです。

特定のエラーを取得する方法は次のとおりです。

michael$ rake environment db:drop
michael$ rake db:create
michael$ rake db:migrate
== 20160908204559 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0091s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0032s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0031s
-- add_index(:users, :confirmation_token, {:unique=>true})
   -> 0.0032s
-- add_index(:users, :unlock_token, {:unique=>true})
   -> 0.0029s
== 20160908204559 DeviseCreateUsers: migrated (0.0219s) =======================

    [WARNING] - The list of tenants to migrate appears to be empty. This could mean a few things:

      1. You may not have created any, in which case you can ignore this message
      2. You've run `apartment:migrate` directly without loading the Rails environment
        * `apartment:migrate` is now deprecated. Tenants will automatically be migrated with `db:migrate`

    Note that your tenants currently haven't been migrated. You'll need to run `db:migrate` to rectify this.
michael$ rake db:seed
Seeding test tenant
One of the following schema(s) is invalid: "test" "public"

ローカルでサイトにアクセスすると、Rails がスローします。

アパート::TenantNotFound

次のスキーマのいずれかが無効です: "www" "public"

ここに私の apartment.rb 初期化子があります:

require 'apartment/elevators/subdomain'
Apartment.configure do |config|
  config.excluded_models = %w{ User }
  config.tenant_names = lambda { User.pluck :subdomain }
  config.use_schemas = true
end
Rails.application.config.middleware.use 'Apartment::Elevators::Subdomain'

ここに私のユーザー移行ファイルがあります:

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      t.string   :unlock_token # Only if unlock strategy is :email or :both
      t.datetime :locked_at

      ## Invitable
      #t.string   :invitation_token
      #t.datetime :invitation_created_at
      #t.datetime :invitation_sent_at
      #t.datetime :invitation_accepted_at
      #t.integer  :invitation_limit
      #t.integer  :invited_by_id
      #t.string   :invited_by_type

      ## User Info
      t.string :first_name
      t.string :last_name
      t.string :subdomain
      t.string :role

      t.timestamps
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    add_index :users, :confirmation_token,   unique: true
    add_index :users, :unlock_token,         unique: true
    #add_index :users, :invitation_token,     unique: true
  end
end

また、コマンド ラインでローカルの Postrgres データベースにもアクセスしました。ドロップが機能し、データベースの作成が機能しています。必要に応じてこれらを提供できます。現時点での私の推測では、Rails が PostgresApp と通信する方法、または移行を行う方法に問題があると言っています。しかし、経験豊富な誰かが、私が見逃していたことを指摘してくれるかもしれません。

だから私の質問は、これを引き起こすために私は何をしているのでしょうか? どうすれば修正できますか?また、何が問題なのかについて詳しく知るにはどうすればよいですか?

4

3 に答える 3

1

さて、私はついにそれを修正しました。移行したときにスキーマ間に不一致があったようです。なんらかの理由でスキーマが更新されていませんでした。これで問題が解決した理由はよくわかりませんが、テナント クラス ファイルと移行ファイル (私の場合は User.rb) に移動し、Devise に最低限必要な部分を除くすべてをコメント アウトしました。次に、一度に1つずつ実行しました。

rake db:drop
rake db:create 
rake db:migrate

移行時に、次のエラーが発生しました。

重複するキー値が一意の制約「index_users_on_email」に違反しています

それで、戻ってすべてのコメントを外し、レーキを再実行して、今度はレーキ db:seed を含めました。そしてそれは働いた!

michael$ rake db:seed
Seeding test tenant
michael$ 

このエラーがスローされた理由についての私の最善の推測は、次のいずれかです。

  1. 古いデータベース スキーマは、何らかの形でドロップ間で永続化されていました
  2. 新しい schema.rb ファイルが更新されておらず、何らかの不一致があったこと

いずれにせよ、これは完璧な嵐のシナリオだったようです。再現できたらまた投稿します。これが他の誰かに起こった場合は、データベース、アパートメント、またはデバイスではなく、スキーマだけに注目してください。これにより、多くの時間を節約できます。これが他の誰かに役立つことを願っています。

于 2016-09-15T14:31:58.327 に答える
0

アパートはサブドメインを探しています: www.site.com. そのため、サブドメインの使用可能な名前のリストから除外する必要があります.

アパート::TenantNotFound

次のスキーマのいずれかが無効です: "www" "public"

に追加する必要がありますinitializers/apartment

Apartment::Elevators::Subdomain.excluded_subdomains = ['www']

メインドメインルーターが必要な場合のボーナス

routers.rb

これにより、メインのwww.site.com または site.comのルート URL が制限されます。

class RootDomain
  @subdomains = ["www"]
  def self.matches?(request)
   @subdomains.include?(request.subdomain) || request.subdomain.blank?
  end
end

constraints(RootDomain) do
  your resources for the main domain only. 
end
于 2016-12-22T17:52:44.300 に答える