我的RoR应用程序中有User模型(在PostgreSQL数据库中),它使用Devise进行身份验证。现在我想邀请用户,所以我决定使用devise_invitable gem。按照安装指南我做了:
我试图运行上面生成的迁移(这是这个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中的大师,它是外键,但看起来应该有invite_bies表,不应该吗?但它并没有被创造出来。所以,我对这一切感到有些困惑。
我的用户设计模型:
devise :invitable, :database_authenticatable, :recoverable, :rememberable, token_authenticatable,:trackable, :authentication_keys => [:email]
生成脚本添加了字段:invitable, :database_authenticatable
。
答案 0 :(得分:2)
你的问题在这里:
3. Run rails generate devise_invitable
那应该是
rails generate devise_invitable MODEL
并将MODEL替换为您的设计模型的名称。这可能是用户,但它应该是您为您设计的模型的名称。因此,如果您使用User作为您的模型:
rails generate devise_invitable User
因为您没有提供模型名称,所以生成器正在生成无效迁移,这可能是一个错误,您可能想要报告该错误。当您的迁移尝试在邀请和发出邀请“invite_by”的“用户”之间创建外键关系时,它会失败,因为它不知道要引用哪个表。
编辑:2013-05-04:
您的用户模型是否也包含此内容:
has_many :invitations, :class_name => self.to_s, :as => :invited_by
答案 1 :(得分:2)
您使用的是Schema_plus Gem吗?
如果您正在使用它,此Gem将尝试根据任何字段的_id创建外键关系。
您需要为此字段
禁用此功能t.integer :invited_by_id, foreign_key: false
如果是这种情况,请告诉我。