如何在 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