【发布时间】:2016-09-15 13:44:16
【问题描述】:
我在 rails(4.2.6) 中使用 devise(4.2.0)。
在我的应用程序中,我在用户和配置文件表中使用嵌套属性。只有在创建新记录时才需要验证密码,更新创建的记录时不会验证密码字段。
我的 user.rb 文件是:
class User < ActiveRecord::Base
has_one :profile
has_one :company_profile
accepts_nested_attributes_for :profile
attr_accessor :profile_updation
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates_presence_of :email, if: :email_required?
validates_presence_of :password, if: :password_required?
validates_confirmation_of :password, if: :password_required?
protected
def email_required?
true && profile_updation.blank?
end
def password_required?
!password.nil? || !password_confirmation.nil?
end
end
当我运行我的应用程序时发生了这个错误:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_email" DETAIL: Key (email)=() already exists. : INSERT INTO "users" ("first_name", "last_name", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"
我搜索了这个问题,但我无法解决它。
schemafile
中的用户和个人资料表create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.inet "current_sign_in_ip"
t.inet "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "first_name"
t.string "last_name"
t.string "user_id"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
add_index "profiles", ["user_id"], name: "index_profiles_on_user_id", using: :btree
create_table "profiles", force: :cascade do |t|
t.string "company_name"
t.integer "country"
t.integer "state"
t.integer "business"
t.string "mobile_no"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.boolean "terms_conditions"
end
【问题讨论】:
-
将您的架构文件添加到问题中(位于
db/schema.rb) -
您是否尝试使用现有电子邮件注册?
-
不,我正在更新现有用户详细信息(名字、姓氏等)
-
“当我运行我的应用程序时,会发生此错误。”--您需要告诉我们运行应用程序时正在运行的代码。您发布的任何代码都不足以导致该错误。很可能,您的应用程序代码只是试图插入两个具有相同电子邮件地址的用户。
-
最大我需要覆盖用户表中的设计验证,用户表有嵌套属性(配置文件)。如果我创建一个新的用户配置文件,我需要验证密码字段,同时密码如果我编辑用户个人资料,该字段未验证...我希望它有助于理解我的问题
标签: ruby-on-rails devise