First_or_initialize和嵌套属性

时间:2013-07-05 01:14:55

标签: ruby-on-rails oauth nested-attributes

我有User模型,基本上有电子邮件用户名
我有一个嵌套的Profile模型,其名称位置描述

User注册时,所有内容(说明除外)为必需。我有一个单独的表单,可以很好地使用这个嵌套模型。

Sign Up form

现在 Oauth :我想允许访问者使用他们的GitHub帐户进行注册。
此方法(RailsCast #235)允许我初始化新的User自动填写 4 User属性:提供者,uid,电子邮件和用户名。

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

但我想要的是用名称初始化嵌套的配置文件,最后用位置来填充我从GitHub获取的哈希信息。

我尝试过像user.build_profile(:name => auth.info.name)user.profile.name = auth.info.name之类的内容,但我似乎无法找到如何构建这个嵌套元素。

1 个答案:

答案 0 :(得分: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 

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