- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有用于 omni-auth 身份验证的 User
模型。我已对其进行设置,以便可以使用不同的提供商(如 facebook、google 帐户)进行登录。如果在使用这些提供商注册时电子邮件已在数据库中,则用户已登录到该帐户。
类用户
包括 Mongoid::Document
embeds_many:供应商
字段:电子邮件,类型:字符串,默认值:“”
结尾类提供者
包括 Mongoid::Document
字段:名称,类型:字符串
字段:uid,类型:字符串
嵌入_in:用户
结尾
我正在使用 from_omniauth
方法根据身份验证信息查找用户。
def from_omniauth(auth)
user=User.find_by(email: auth.info.email)
如果用户返回用户
where(:"providers.name"=> auth.provider, :"provider.uid"=> auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
结尾
结束
但是当它找不到用户并尝试创建一个用户时,我遇到了一个错误。Mongoid::Errors::UnknownAttribute:
信息:
试图为模型用户设置不允许的“providers.name”值。
但是为什么它认为这是动态字段生成,因为我已经定义了关联。我也尝试了 find_or_initialize
方法,但同样的错误。
谁能帮我弄清楚。提前致谢。
最佳答案
这里有一些魔法。
当您根据上述条件调用#first_or_create 时:
where(:"providers.name" => auth.provider, :"provider.uid" => auth.uid ).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
end
这实际上是被脱糖成更像这样的东西:
found_user_with_provider = where(:"providers.name" => auth.provider, :"provider.uid" => auth.uid ).first
if found_user_with_provider.nil?
new_user = User.new
new_user.set(:"providers.name", auth.provider)
new_user.set(:"providers.uid", auth.uid)
new_user.email = auth.info.email
new_user.password = Devise.friendly_token[0,20]
else
found_user_with_provider.email = auth.info.email
found_user_with_provider.password = Devise.friendly_token[0,20]
end
注意尝试将“provider.name”和“provider.uid”的值设置为用户实例的属性 - 这实际上不是您想要的,而 Mongoid 正是提示。
你实际上可能想要更像这样的东西:
def from_omniauth(auth)
user = User.find_by(email: auth.info.email)
return user if user
found_user_with_provider = where(:"providers.name" => auth.provider, :"provider.uid" => auth.uid ).first
if found_user_with_provider
found_user_with_provider.update_attributes!(
:email => auth.info.email,
:password => Devise.friendly_token[0,20]
)
return found_user_with_provider
end
User.create!({
:providers => [
Provider.new({
:name => auth.provider,
:uid => auth.uid
})
],
:email => auth.info.email,
:password => Devise.friendly_token[0,20]
})
end
当然还有一个问题,那就是您要在您的用户实例上设置一个#password 属性。确保添加:
field :password,type: String, default: ""
对于您的用户模型 - 否则您会像以前一样收到关于动态字段的投诉 - 只是这次是关于不同的字段。
关于ruby-on-rails - mongoid 中具有 embeds_many 关联的 first_or_create 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37075602/
有什么办法可以用embeds_many在 Ecto 没有 id/primary_key field ? 我的数据库依赖于在这个字段上有一个唯一的索引,而 ecto 自动插入键打破了这个要求。 最佳答案
尝试使用 Ecto embeds_many 进行试验,效果很好,直到我需要查询嵌入字段中的一些数据。 所以我有一个类似 product 的东西 embeds_many categories schem
我已经找了好几天都没有找到我的问题的确切答案,这个答案就这么简单:我有一个简单的模型,有书和作者。一本书嵌入了许多作者,而作者嵌入在书中。但是每当我保存一本新书时,作者数组就不会保留。 我有一个 An
我有 2 个看起来像这样的 Mongoid 模型: class User include Mongoid::Document field :name, type: String embed
如何为我的嵌入对象设置默认顺序,例如: class Post embeds_many :comments, :order => "author" accepts_nested_attribut
在 embeds_many 之间进行选择时应考虑哪些要点?和references_many (或 embeds_one 和 references_one )在 Mongoid 中? 我目前更喜欢 em
我有一个 embeds_many 关联,我正在尝试建立它,我以前已经成功地完成了它,但我正在尝试以一种嵌套形式完成这一切,但我无法弄清楚。 假设我们有一个pocket模型: class Pocket
尝试使用此 railscast 作为指南: http://railscasts.com/episodes/197-nested-model-form-part-2?view=asciicast 遇到这
使用 Rails 3.2 和 Mongoid 2.4。我有一个遗留模型 Organization,它嵌入了很多 organization_members。它看起来像这样: class Organiza
class Hotel include Mongoid::Document field :title, type: String embeds_many :comments end cla
我有两个模型,Owner 和 Property,其中 Owner 的模式有一个 embeds_many声明,像这样: defmodule MyApp.Owner do use MyApp.Web,
我的应用程序有这个事件模型。如果我创建另一个模型:日期...那么一个事件可以有多个日期,我应该使用 Events EmbedsMany Dates 吗?或者更好地使用 Events hasMany D
class Report include Mongoid::Document embeds_many :figures end class Figure include Mongoid::
我有一个嵌入了许多“SuggestedPerson”的模型“Person”。 SuggestedPerson 还引用另一个人(被建议的人)。所以 Person 需要 embed_many 和 has_
我有用于 omni-auth 身份验证的 User 模型。我已对其进行设置,以便可以使用不同的提供商(如 facebook、google 帐户)进行登录。如果在使用这些提供商注册时电子邮件已在数据库中
我有这样一个模型: class Search include Mongoid::Document embeds_many :terms accepts_nested_attributes_
我有一个 Submittable 类,其中嵌入了很多提交。我有一个 rspec 测试,我想在其中将新的提交推送到 Submittable.submissions 集合。如果我使用哈希初始化提交,它会工
我有两个模型,博客和主题。博客 embeds_many :themes 和 Theme embedded_in :blog。我也有 Blog embeds_one :theme (用于激活的主题)。这
谁能给我解释一下 embeds_many 和 has_many 在 mongoid 中的区别? 最佳答案 embeds_many 用于在父文档中存储相关文档。 has_many 用于将文档之间的关系存
哇 - 许多项目都包含在这个项目中,我做了一些(广泛的)搜索但无济于事,所以抛出一个 flare 看看是否有其他人正在使用类似的堆栈并有解决方案。 我正在使用 Mongoid-enabled fork
我是一名优秀的程序员,十分优秀!