我有User
模型,基本上有电子邮件和用户名。
我有一个嵌套的Profile
模型,其名称,位置和描述。
当User
注册时,所有内容(说明除外)为必需。我有一个单独的表单,可以很好地使用这个嵌套模型。
现在 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
之类的内容,但我似乎无法找到如何构建这个嵌套元素。
答案 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
这对我来说很酷!我希望这对其他人也有帮助。