8

Ich verwende Rails 3.0.9 und entwerfe für die Authentifizierung. Jetzt versuche ich die Vererbung einzelner Tabellen zu verwenden, weil ich Polymorphismus verwenden muss, also habe ich zwei Klassen: UserType1 und UserType2, die von der User-Klasse erben. Ich brauche diese Devise-Instanz korrekt den current_user abhängig vom Typ des Benutzers.devise: instance der current_user mit der Vererbung einzelner Tabellen

Zum Beispiel

class User < ActiveRecord::Base 
#devise and other user logic 
end 

class UserType1 < User 
    def get_some_attribute 
    return "Hello, my type is UserType1" 
    end 
end 

class UserType2 < User 
    def get_some_attribute 
    return "Hello, my type is UserType2" 
    end 
end 

In controller 

class MyController < ApplicationController 
    def action 
    @message = current_user.get_some_attribute #depending the type using polymorphism 
    render :my_view 
    end 
end 
+0

Ich habe auch das gleiche Problem – maxiperez

+0

Haben Sie die Spalte "Typ" in der Tabelle Benutzer hinzugefügt? Das ist der Grund, warum Rails STI funktioniert. – Salil

+0

Vergiss mein Kopfgeld, 'current_user' ist gut instanziiert. –

Antwort

4

es ist genau das, was Sie brauchen: http://blog.jeffsaracco.com/ruby-on-rails-polymorphic-user-model-with-devise-authentication

müssen Sie die Zeichen in Pfad-Methode in Ihrer Anwendung Controller außer Kraft zu setzen, hoffen, dass es helfen.

+0

Entschuldigung, wie ich in den Kommentaren + Antwort gesagt habe, vergiss mein Kopfgeld, 'current_user' ist tatsächlich gut durch den STI-Mechanismus instanziiert. Ich setze das Kopfgeld zu schnell, ohne es bisher zu testen;) –

+0

keine Probleme, ich versuche einfach zu helfen :) – rbinsztock

+0

Link ist tot :-(. –

1

Sie müssen get_some_attribute Methode hinzufügen innen User Modell

Module User < ActiveRecord::Base 

    #devise and other user logic 

    def get_some_attribute 
     #You can put shared logic between the two users type here 
    end 

end 

dann, es in den Benutzeruntertypen außer Kraft zu setzen, wie folgt aus:

Module UserType1 < User 

    def get_some_attribute 
     super 
     return "Hello, my type is UserType1" 
    end 

end 

Module UserType2 < User 

    def get_some_attribute 
     super 
     return "Hello, my type is UserType2" 
    end 

end 

Dann wird current_user.get_some_attribute arbeiten, wie Sie erwartet , wenn Sie mehr über überschreibende Methoden in Ruby lesen möchten, können Sie darüber lesen here

Ich habe super hinzugefügt, da ich davon ausgegangen bin, dass Sie eine gemeinsame Logik in get_some_attribute haben, da es get_some_attribute im Benutzermodell aufrufen wird, können Sie es entfernen, wenn Sie es nicht benötigen.

Viel Glück!

+0

Ich rate Ihnen, nur einen Benutzertyp zu verwenden und von Rollen abhängig zu sein um zu bestimmen, was zu tun ist .. – simo

Verwandte Themen