2

我有一个User基本上包含电子邮件用户名的模型。
我有一个嵌套Profile模型,它有一个名称、一个位置和一个描述

当 aUser注册时,所有内容(除了描述)都是必需的。我有一个与这个嵌套模型完美配合的表单。

注册表单

现在来了Oauth:我想允许访问者使用他们的 GitHub 帐户进行注册。
这个方法(RailsCast #235)允许我初始化一个新的User自动填写4 个User属性:provider、uid、email 和 username。

def self.from_omniauth(auth)
  where(auth.slice(:provider, :uid)).first_or_initialize do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.email = auth.info.email
    user.username = auth.info.nickname
  end
end

但我还想用name初始化一个嵌套的 Profile ,最后是position,其中填充了我从 GitHub 获得的散列信息。

我尝试放置类似的东西user.build_profile(:name => auth.info.name)user.profile.name = auth.info.name但我似乎无法找到如何构建这个嵌套元素。

4

1 回答 1

0

我通过以下方式解决了这个问题(我使用设计和 ominauth):
这是“RegistrationsController”

# GET /resource/sign_up
def new
   resource = build_resource({})
   # check the session exists or not
   if session["devise.user_person_attributes"]
      ### just do anything you need to do prefill the form. this works very well for me
      resource.build_person(gender: session["devise.user_person_attributes"]["gender"]) 
   else
      resource.build_person
   end
   respond_with root_path
end

对于“OmniauthCallbacksController”,我这样做:

def all
    omniauth = request.env["omniauth.auth"]
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
    if authentication
        .
        .(SOME CODE OMITTED)
    elsif current_user
        .
        .
        .(SOME CODE OMITTED)
    else
        user = User.from_omniauth(omniauth)
        flash[:notice] = "Please finalize your registration"
        session["devise.user_attributes"] = user.attributes
        session["devise.user_person_attributes"] = user.person.attributes
        session["devise.auth_attributes"] = user.authentications.first.attributes

        redirect_to new_user_registration_url
    end
end

alias_method :twitter, :all
alias_method :facebook, :all 

这对我来说很酷!我希望这对其他人也有帮助。

于 2013-08-26T02:14:36.993 回答