繁体   English   中英

如何在 ruby​​ on rails 中处理 omniauth 的多个设计模型

[英]how to deal with multiple devise model for omniauth in ruby on rails

我有 3 类用户(学生、教师和管理员)。 学生将记录他们的学习,教师将监督学生,管理员将管理服务。 所以我为所有用户制作了一个设计宝石。 实际上,我的目的是让每个用户都可以使用 facebook 或 twitter 登录,但我不能这样做,因为设计中的 omniauthable 仅支持一种设计模型......如何处理 omniauth 的多个设计模型,例如

<%= link_to 'student login with facebook', ........ %>
<%= link_to 'teacher login with facebook', ........ %>

您可以按照如何绕过设置多个型号,设计出这种设计指南:omniauthable 这里

如果您可以绕过使用多个模型,则应考虑使用具有 3 个角色(学生、教师、管理员)的 1 个User模型。 查看cancancan gem,它可能更适合您想要做的事情。

我使用 omniauth 解决了一个模型的问题。 对于另一个模型,我设置了相同的 omniauth_login 按钮和一个参数,比如 student: 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM