设计,如何使用MongoDB的嵌入式文档

时间:2014-09-02 00:10:52

标签: ruby-on-rails mongodb devise mongoid warden

在我的Rails应用程序中,我必须使用模型:Account&用户。我使用MongoID和Devise与Omniauth。

我在使用此配置正确登录用户方面存在一些问题并提出警告:

class Account
  #code..
  include Mongoid::Document
  embeds_many :users
  #code..
end

class User
  #code..
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable
  devise :omniauthable, omniauth_providers: [:twitter] #just an example.. 

  include Mongoid::Document
  embedded_in :account
  #code..
end

一个非常标准的OmniauthCallbacksController:

 class OmniauthCallbacksController < Devise::OmniauthCallbacksController

   def twitter
     callback_of('Twitter')
   end

   protected

   def callback_of(provider)
     @user = User.find_user_from(request.env["omniauth.auth"])
     @user = User.new_with(request.env["omniauth.auth"]) if @user.blank?

     if @user.persisted?
       sign_in_and_redirect @user, event: :authentication #this will throw if @user is not activated
       set_flash_message(:notice, :success, kind: provider) if is_navigational_format?
     else
       redirect_to new_user_registration_path, alert: "There was a problem with your #{provider} account. Please try again."
     end
   end

   def after_sign_in_path_for(resource)
     if resource.registered
       account_path(resource.account)
     else
       new_account_path
     end
   end
end

该代码效果很好,如果用户未注册,则创建帐户文档并在其中存储嵌入的用户文档。然后它被称为sign_in_and_redirect @user, event: :authentication并且用户已正确登录。然后重定向到new_account_path,其中事情变得奇怪..

重定向后,用户不再登录,因此所有设计助手(如current_user)都无用。我想这是因为用户被嵌入帐户中,因此Warden无法正确找到用户。

我发现了这个Devise wiki&#39; post,但似乎已经过时了。

我不是设计/监护专家,所以我需要一些帮助。任何帮助将非常感激。

谢谢!

0 个答案:

没有答案