2016-03-23 14 views
0

Ich habe hier ein paar Lösungen gesehen, aber keine hat mein Problem beantwortet. Ich benutzte Devise, um zwei Modelle zu generieren, nämlich: Benutzer und Designer. Und ich muss Omniumuth verwenden, um sich für diese zwei Modelle getrennt zu registrieren/zu registrieren. Zur Zeit ist es das, was ich habe:Devise + Omniauth mehrere Modelle

User.rb

def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
    user.provider = auth.provider 
    user.uid = auth.uid 
    user.user_name = auth.info.name 
    user.email = auth.info.email 
    user.password = "password" 
    user.skip_confirmation! 
end 

user_authentications_controller.rb

class UserAuthenticationsController < Devise::OmniauthCallbacksController 

def create 
    begin 
     @user = User.from_omniauth(request.env['omniauth.auth']) 
     sign_in_and_redirect @user 
     #redirect_to root_url, notice: "Signed in!" 
     flash[:success] = "Welcome, #{@user.first_name}!" 
     UserMailer.welcome(@user).deliver_now 
     rescue 
     flash[:warning] = "There was an error while trying to authenticate you..." 
     end 
    end 
end 

designer.rb

def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |designer| 
    designer.provider = auth.provider 
    designer.uid = auth.uid 
    designer.user_name = auth.info.name 
    designer.email = auth.info.email 
    designer.password = "password" 
    designer.skip_confirmation! 
    end 
end 

designer_authentication_controller.rb

DesignerAuthenticationsController < Devise::OmniauthCallbacksController 


    def create 
    begin 
     @designer = Designer.from_omniauth(request.env['omniauth.auth']) 
     sign_in_and_redirect @designer 
     #redirect_to root_url, notice: "Signed in!" 
     flash[:success] = "Welcome, #{@designer.first_name}!" 
     UserMailer.welcome(@designer).deliver_now 
     rescue 
     flash[:warning] = "There was an error while trying to authenticate you..." 
     end 
    end 
end 

routes.rb

devise_scope :user do get "/auth/:provider/callback" => "user_authentications#create" end 
devise_scope :designer do get "/auth/:provider/callback" => "designer_authentications#create" end 

Meine Probleme sind:

1) Ganz gleich, von welcher Seite ich registrieren, Designer oder Benutzer an, als Benutzer anmelden wird. Ich verstehe das, weil es user_authentications_controller für beide Anmeldung verwendet. Irgendwelche Ideen, wie kann ich bestimmen lassen, welchen Controller es auf der Anmeldeseite aufrufen wird?

2) Mache ich den richtigen Weg, oder gibt es bessere Möglichkeiten für die Anmeldung mehrerer Modelle?

Danke. Und bitte hilf!

Antwort

0

Warum die Notwendigkeit für zwei Modelle? Sie können dieselbe Berechtigung verwenden und dann über eine Rolle zwischen Benutzer oder Designer unterscheiden. Ich würde mir ein paar Railscasts-Videos anschauen, um mit den verschiedenen Techniken auf dem Laufenden zu sein.

Rollen mit Cancan: http://railscasts.com/episodes/192-authorization-with-cancan

Dit man ein Gefühl zu bekommen, wie Sie Ihre eigenen Auth schreiben: http://railscasts.com/episodes/250-authentication-from-scratch-revised

1

Lassen Sie mich meine Erfahrung hier teilen, hatte ich die gleiche Sache wie Sie getan tun gerade. Das Problem könnte sein, dass Sie nicht alle Schritte für beide Benutzer durchgeführt haben.

Hier ist eine Zusammenfassung der Schritte zu folgen -

1) rails generate devise MODEL (user and designer) 

2) rails generate devise:controllers [scope] (users and designers) 

3) rails generate devise:views USER (users and deigners) 

Danach wird ein Rake Routen tun und sehen, wie verschiedene Routen durch devise erstellt werden sowohl für Benutzer und Entwickler und es dementsprechend nennen.

Nach meinem besten Wissen ist es besser, Rollen zu verwenden, als verschiedene Benutzer zu erstellen, da die Codebase später sehr unordentlich wird. Wenn Sie gerade erst damit beginnen, einen zu bauen, sind Rollen der richtige Weg.

Verwandte Themen