我的Facebook身份验证工作完美,但我有两种不同的帐户类型:basic-user
和member
。所以我有两个按钮,用户可以选择basic
或member
并切换到相应的表单。
问题:
我想知道的是我的facebook按钮如何确定这是member
还是basic
。我可以在登录的member
部分添加什么内容?
第一个想法 - 我的想法是使用Facebook link_to omniauth facebook call and the submit button
为隐藏字段创建一个隐藏字段,该字段将给出user_type
。给用户创建。
这个^的一个问题是使用hidden_field:user_type
提交的表单将在facebook omniauth被调用之前先进行。注册路径需要密码,所以我不确定这是否有效。
第二个想法 - 我可以在facebook按钮中存储信息吗?我可以为按钮设置第二个控制器动作,以便在facebook创建我的用户之后,将发生第二个动作,即成员的验证。
或者我可以在facebook按钮中输入一个值来传递给同一个控制器吗?
到目前为止我所拥有的一切!
def self.from_omniauth(auth)
anonymous_username = "NewUser#{User.last.id + 1}"
generated_password = Devise.friendly_token[0,20]
user = User.where(:email => auth.info.email, :username => anonymous_username).first
if user
return user
else
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.confirmed_at = Time.now
user.fullname = auth.info.name
user.provider = auth.provider
user.uid = auth.uid
user.username = anonymous_username
user.email = auth.info.email
user.password = generated_password
if auth.info.image.present?
avatar_url = process_uri(auth.info.image)
user.avatar = URI.parse(avatar_url)
end
end
end
end
Omniauth Callback_controller:
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
@user = User.from_omniauth(request.env["omniauth.auth"])
if @user.persisted?
sign_in_and_redirect @user, :event => :authentication
set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
else
session["devise.facebook_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
end
Facebook按钮+第一个想法hidden_field
:
<%= form_for(@user, :url=> '/user/action', :method=> 'update', :html => {:id=>'facebook-form'} ) do |f| %>
<%= link_to "Sign Up With Facebook", user_omniauth_authorize_path(:facebook), :onclick => "$('#facebook-form').submit()", class:"btn btn-primary2" %>
<% end %>