如何在 rails 上的 ruby 中处理 omniauth 的多个设计模型
how to deal with multiple devise model for omniauth in ruby on rails
我有 3 种类型的用户(学生、教师和管理员)。学生将记录他们的学习,教师将监督学生,管理员将管理服务。所以我让所有用户都设计了 gem。实际上我的目的是每个用户都可以使用 facebook 或 twitter 登录,但我不能这样做,因为 omniauthable in devise 只支持一种设计模型......
如何处理像
这样的omniauth的多个设计模型
<%= link_to 'student login with facebook', ........ %>
<%= link_to 'teacher login with facebook', ........ %>
您可以按照此 Devise 指南了解如何使用 Devise 设置多个模型 :omniauthable
here。
如果您可以使用多个模型,您应该考虑使用具有 3 个角色(学生、教师、管理员)的 1 个 User
模型。查看 cancancan gem,这可能更适合您想要做的事情。
我使用 omniauth 解决了一个模型的问题。对于另一个模型,我设置了相同的 omniauth_login 按钮加上一个参数,例如学生:true,例如:
<%= link_to user_google_oauth2_omniauth_authorize_path(doctor: true) do %>
<i class="fab fa-google"></i>
<div>Continua con Google</div>
<% end %>
然后在我的 omniauth 回调控制器上
def google_oauth2
set_user
if @user.persisted?
sign_in_and_redirect @user, event: :authentication
else
# Removing extra as it can overflow some session stores
session['devise.google_data'] = request.env['omniauth.auth'].except(:extra)
redirect_to new_user_registration_url, alert:
@user.errors.full_messages.join("\n")
end
end
def set_user
@user = if request.env['omniauth.params']['doctor']
Doctor.from_omniauth(request.env['omniauth.auth'])
else
User.from_omniauth(request.env['omniauth.auth'])
end
end
我有 3 种类型的用户(学生、教师和管理员)。学生将记录他们的学习,教师将监督学生,管理员将管理服务。所以我让所有用户都设计了 gem。实际上我的目的是每个用户都可以使用 facebook 或 twitter 登录,但我不能这样做,因为 omniauthable in devise 只支持一种设计模型...... 如何处理像
这样的omniauth的多个设计模型<%= link_to 'student login with facebook', ........ %>
<%= link_to 'teacher login with facebook', ........ %>
您可以按照此 Devise 指南了解如何使用 Devise 设置多个模型 :omniauthable
here。
如果您可以使用多个模型,您应该考虑使用具有 3 个角色(学生、教师、管理员)的 1 个 User
模型。查看 cancancan gem,这可能更适合您想要做的事情。
我使用 omniauth 解决了一个模型的问题。对于另一个模型,我设置了相同的 omniauth_login 按钮加上一个参数,例如学生:true,例如:
<%= link_to user_google_oauth2_omniauth_authorize_path(doctor: true) do %>
<i class="fab fa-google"></i>
<div>Continua con Google</div>
<% end %>
然后在我的 omniauth 回调控制器上
def google_oauth2
set_user
if @user.persisted?
sign_in_and_redirect @user, event: :authentication
else
# Removing extra as it can overflow some session stores
session['devise.google_data'] = request.env['omniauth.auth'].except(:extra)
redirect_to new_user_registration_url, alert:
@user.errors.full_messages.join("\n")
end
end
def set_user
@user = if request.env['omniauth.params']['doctor']
Doctor.from_omniauth(request.env['omniauth.auth'])
else
User.from_omniauth(request.env['omniauth.auth'])
end
end