8

Używam szyn 3.0.9 i próbuję uwierzytelnienia. Teraz próbuję użyć dziedziczenia pojedynczej tabeli, ponieważ muszę użyć polimorfizmu, więc mam dwie klasy: UserType1 i UserType2, które dziedziczą z klasy User. Potrzebuję tej instancji Devise poprawnie current_user w zależności od typu użytkownika.devise: wystąpienie current_user przy użyciu pojedynczego dziedziczenia tabeli

Na przykład

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

Mam również ten sam problem – maxiperez

+0

Czy dodałeś kolumnę "typ" w tabeli użytkowników? Właśnie to sprawia, że ​​Rails STI działa. – Salil

+0

Zapomnij o mojej nagród, 'current_user' jest dobrze utworzone. –

Odpowiedz

4

to jest dokładnie to, czego potrzebujesz: http://blog.jeffsaracco.com/ruby-on-rails-polymorphic-user-model-with-devise-authentication

trzeba zastąpić znak w metodzie ścieżki w kontrolerze aplikacji nadzieję, że to pomoże.

+0

Przykro mi, jak już powiedziałem w komentarzach + odpowiedź, zapomnij o mojej nagród, 'current_user' jest w rzeczywistości dobrze utworzony przez mechanizm STI. Stawiam nagrodę zbyt szybko, nie testując do tej pory;) –

+0

żadnych problemów, tylko próbuję pomóc :) – rbinsztock

+0

Link jest martwy :-( –

1

Trzeba będzie dodać get_some_attribute metoda wewnątrz User modelu

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 

następnie, aby go zastąpić w rodzaju sub użytkownika, jak poniżej:

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 

Następnie current_user.get_some_attribute zadziała jak spodziewasz , jeśli chcesz przeczytać więcej o nadpisywaniu metod w Ruby, możesz przeczytać o tym here

Dodałem super, ponieważ założyłem, że masz pewną wspólną logikę w get_some_attribute, ponieważ będzie ona wywoływać get_some_attribute w modelu użytkownika, możesz ją usunąć, jeśli jej nie potrzebujesz.

Powodzenia!

+0

Radzę używać tylko jednego typu użytkownika i zależy od ról ustalić, co robić ... – simo

Powiązane problemy