我在我的RoR 4网络应用程序中使用了omniauth和身份策略。
关注Ryan的RailsCast 304和241用户模型已按以下方式生成:
$ 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
谢谢:)
答案 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"}