0

認証にDeviseを使用しているRoRアプリケーションにユーザーモデル(PostgreSQLデータベース内)があります。ユーザーを招待したいので、devise_invitable gem を使用することにしました。私が行ったインストールガイドに従って:

  1. Gemfile に gem 'devise_invitable' を追加
  2. rails generate devise_invitable:install を実行します
  3. rails generate devise_invitable ユーザーを実行します

上記で生成された移行を実行しようとしたよりも (これは、この gem によって指定されたデフォルトのものであり、次のようになります:)

class DeviseInvitableAddToUsers < ActiveRecord::Migration
  def up
    change_table :users do |t|
      t.string     :invitation_token, :limit => 60
      t.datetime   :invitation_sent_at
      t.datetime   :invitation_accepted_at
      t.integer    :invitation_limit
      t.references :invited_by, :polymorphic => true
      t.index      :invitation_token, :unique => true # for invitable
      t.index      :invited_by_id
    end

    # And allow null encrypted_password and password_salt:
    change_column_null :users, :encrypted_password, true
  end

  def down
    change_table :users do |t|
      t.remove_references :invited_by, :polymorphic => true
      t.remove :invitation_limit, :invitation_sent_at, :invitation_accepted_at,   :invitation_token
    end
  end
end

しかし、移行の実行中に次のようになります。

==  DeviseInvitableAddToUsers: migrating ======================================
-- change_table(:users)
rake aborted!
An error has occurred, this and all later migrations canceled:

PG::Error: ERROR:  relation "invited_bies" does not exist
: ALTER TABLE "users" ADD CONSTRAINT fk_users_invited_by_id FOREIGN KEY ("invited_by_id") REFERENCES "invited_bies" ("id")

私は PostgreSQL の第一人者ではなく、それは外部キーですが、inviteted_bies テーブルがあるはずですよね? しかし、それは作成されていません。だから、私はこれに少し困惑しています。

デバイスの私のユーザーモデル:

devise :invitable, :database_authenticatable, :recoverable, :rememberable, token_authenticatable,:trackable, :authentication_keys => [:email]

フィールド:invitable, :database_authenticatableは生成スクリプトによって追加されました。

4

2 に答える 2

2

あなたの問題はここにあります:

3. Run rails generate devise_invitable

そうあるべき

rails generate devise_invitable MODEL

MODEL をデバイス モデルの名前に置き換えます。それはおそらく User ですが、あなたが工夫して管理しているモデルの名前でなければなりません。したがって、ユーザーをモデルとして使用する場合:

rails generate devise_invitable User

モデル名を指定しなかったため、ジェネレーターは無効な移行を生成しています。これはおそらくバグであり、報告することをお勧めします)。移行が招待と、招待を作成した「invited_by」を作成した「ユーザー」との間に外部キー関係を作成しようとすると、参照するテーブルがわからないため失敗します。

編集: 2013-05-04:

User モデルにもこれが含まれていますか:

 has_many :invitations, :class_name => self.to_s, :as => :invited_by
于 2013-05-03T14:57:28.130 に答える