阻止关联在 Rails 5 中验证
Stop Associations from Validating in Rails 5
使用 Rails 5,我正在尝试实施 Omniauth-Facebook 和 Clearance 以进行用户身份验证。
注意:我的代码和this Gist
一模一样
我大部分时间都在使用它。然而,当使用 Facebook 注册时(即用户从未访问过该站点),Rails 会抛出错误 Validation failed: User must exist
。我已经将问题缩小到要点中的这个块:
def self.create_with_omniauth(auth_hash)
create! do |auth|
auth.provider = auth_hash["provider"]
auth.uid = auth_hash["uid"]
auth.token = auth_hash["credentials"]["token"]
end
end
当它命中时,它会在没有 auth.user
对象的情况下尝试 create!
,但失败了。这是来自 sessions
控制器的相关代码:
#-- Spectically, the line below
authentication = Authentication.find_by_provider_and_uid(auth_hash["provider"], auth_hash["uid"]) || Authentication.create_with_omniauth(auth_hash)
#-- More code, for context
if authentication.user
user = authentication.user
authentication.update_token(auth_hash)
@next = root_url
@notice = "Signed in!"
else
user = User.create_with_auth_and_hash(authentication,auth_hash)
@next = edit_user_path(user)
@notice = "User created - confirm or edit details..."
end
我从 Gist 中唯一遗漏的是他的 Authentications
table 的结构。使用我找到的上下文线索,我创建了这个 table:
def change
create_table :authentications do |t|
t.string :provider
t.string :uid
t.string :token
t.references :user, foreign_key: true
t.timestamps
end
end
如果需要更多信息,我会尽力提供
在 Rails 5 中,默认需要 belongs_to http://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html,因此如果没有它,您将收到验证错误。
在此示例中,您尝试创建没有 User
的 Authentication
对象,这就是您得到 "Validation failed: User must exist".
的原因
如果您真的想创建没有用户的身份验证对象,这应该可行:
class Authentication < ActiveRecord::Base
belongs_to :user, optional: true
end
使用 Rails 5,我正在尝试实施 Omniauth-Facebook 和 Clearance 以进行用户身份验证。
注意:我的代码和this Gist
一模一样我大部分时间都在使用它。然而,当使用 Facebook 注册时(即用户从未访问过该站点),Rails 会抛出错误 Validation failed: User must exist
。我已经将问题缩小到要点中的这个块:
def self.create_with_omniauth(auth_hash)
create! do |auth|
auth.provider = auth_hash["provider"]
auth.uid = auth_hash["uid"]
auth.token = auth_hash["credentials"]["token"]
end
end
当它命中时,它会在没有 auth.user
对象的情况下尝试 create!
,但失败了。这是来自 sessions
控制器的相关代码:
#-- Spectically, the line below
authentication = Authentication.find_by_provider_and_uid(auth_hash["provider"], auth_hash["uid"]) || Authentication.create_with_omniauth(auth_hash)
#-- More code, for context
if authentication.user
user = authentication.user
authentication.update_token(auth_hash)
@next = root_url
@notice = "Signed in!"
else
user = User.create_with_auth_and_hash(authentication,auth_hash)
@next = edit_user_path(user)
@notice = "User created - confirm or edit details..."
end
我从 Gist 中唯一遗漏的是他的 Authentications
table 的结构。使用我找到的上下文线索,我创建了这个 table:
def change
create_table :authentications do |t|
t.string :provider
t.string :uid
t.string :token
t.references :user, foreign_key: true
t.timestamps
end
end
如果需要更多信息,我会尽力提供
在 Rails 5 中,默认需要 belongs_to http://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html,因此如果没有它,您将收到验证错误。
在此示例中,您尝试创建没有 User
的 Authentication
对象,这就是您得到 "Validation failed: User must exist".
如果您真的想创建没有用户的身份验证对象,这应该可行:
class Authentication < ActiveRecord::Base
belongs_to :user, optional: true
end