将字段添加到Omniauth用户模型

时间:2014-08-02 08:47:49

标签: ruby-on-rails ruby-on-rails-4 omniauth

我在我的RoR 4网络应用程序中使用了omniauth和身份策略。

关注Ryan的RailsCast 304241用户模型已按以下方式生成:

$ rails g model user provider:string uid:string name:string

在我的用户模型中,我有这个:

class User < ActiveRecord::Base
  has_many :profiles
  has_many :packages
  has_many :transactions
  has_many :links
  def self.from_omniauth(auth)
    find_by_provider_and_uid(auth["provider"], auth["uid"]) || create_with_omniauth(auth)
  end

  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["info"]["name"]
    end
  end
end

现在,每个人都像魅力一样工作,但是如何为用户模型添加新的自定义字段呢?

这就是我的所作所为:

1-将新字段添加到用户模型并迁移:

t.string :stripe_customer_id

2-在表单中添加了自定义字段:

<%= hidden_field_tag :stripe_customer_id %>

3-在我的控制器中,我允许所有参数(不太安全):

def user_params
  params.require(:user).permit!
end

4-这里是我的问题:如何在我的用户模型中获取此值?

class User < ActiveRecord::Base
  has_many :profiles
  has_many :packages
  has_many :transactions
  has_many :links
  def self.from_omniauth(auth)
    find_by_provider_and_uid(auth["provider"], auth["uid"]) || create_with_omniauth(auth)
  end

  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["info"]["name"]
      user.stripe_customer_id = ?????????????
    end
  end
end

谢谢:)

2 个答案:

答案 0 :(得分:1)

这是一个可能的解决方案:

用户控制器中的metod self.from_omniauth(auth)由会话控制器调用。在会话控制器中,我有我需要的所有参数。

修改后的用户模型:

class User < ActiveRecord::Base
  has_many :profiles
  has_many :packages
  has_many :transactions
  has_many :links
  def self.from_omniauth(auth,stripe_customer_id)
    find_by_provider_and_uid(auth["provider"], auth["uid"]) || create_with_omniauth(auth,stripe_customer_id)
  end

  def self.create_with_omniauth(auth,stripe_customer_id)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["info"]["name"]
      user.stripe_customer_id = stripe_customer_id
    end
  end
end

和新的SessionController:

  def create
    user = User.from_omniauth(env["omniauth.auth"], params["stripe_customer_id"])
    session[:user_id] = user.id
    redirect_to profiles_url
  end

答案 1 :(得分:0)

您只能获取Omniauth提供商提供的数据。以下是引用的列表:https://github.com/intridea/omniauth/wiki/Auth-Hash-Schema

以下是如何在设计中添加许可证:

在application_controller.rb

 before_action :configure_permitted_parameters, if: :devise_controller?


protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:fullname, :email, :password, :password_confirmation) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:avatar, :fullname, :email, :password, :password_confirmation, :current_password) }
  end

您也可以通过以下方式创建自己的控制器:

# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  def new
    super
  end

  def create
    # add custom create logic here
  end

  def update
    super
  end
end 

然后使用该控制器而不是默认值:

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}