1

我正在尝试从我的用户模型中提取个人资料信息。目前我正在使用 Omniauth(twitter 和 facebook)来创建用户并将所有信息写入用户表......这很好,但是我被告知正确的 Rails 约定是将用户和配置文件分开。

经过几天的反复试验,在使用来自 Omniauth 哈希的用户信息创建配置文件时,我无法让 has_one 关系正常工作。

我尝试使用 before_filter 在创建用户之前自动创建配置文件,这会在配置文件表中正确创建 user_id 外键,但是我似乎无法获得任何要写入的omniauth 哈希数据。

我的会话控制器:

def create
  auth = request.env["omniauth.auth"]

  if user = User.find_by_provider_and_uid(auth["provider"], auth["uid"])
    redirect_to root_url, :notice => 'Signed In'
  else
    user = User.create_with_omniauth(auth)
    redirect_to profile_path(user), :notice => 'Please verify your profile'
  end

在我的用户模型中:

before_create :create_profile

  def self.create_profile(auth)
    create! do |profile|
      profile.user_id = session[:user_id]
      profile.name = auth["info"]["name"]
      profile.email = auth["info"]["email"]
      profile.nickname = auth["info"]["nickname"]
      profile.location = auth["info"]["location"]
      profile.image = auth["info"]["image"]
     end
   end

   ...

我尝试的另一个选项是使用配置文件模型编写配置文件数据......它适用于 Omniauth 哈希数据,但不会写入正确的 user_id(所以没有外键)

配置文件.rb

def self.create_profile_with_omniauth(auth)
  create! do |profile|
    profile.user_id = session[:user_id]
    profile.name = auth["info"]["name"]
    profile.email = auth["info"]["email"]
    profile.nickname = auth["info"]["nickname"]
    profile.location = auth["info"]["location"]
    profile.image = auth["info"]["image"]
  end
end
4

0 回答 0