8

Sto utilizzando i binari 3.0.9 e concepito per l'autenticazione. Ora sto cercando di utilizzare l'ereditarietà di una singola tabella perché ho bisogno di usare il polimorfismo, quindi ho due classi: UserType1 e UserType2, che ereditano dalla classe User. Ho bisogno di quell'istanza di Devise correttamente l'utente corrente in base al tipo di utente.escogitare: istanza l'utente corrente utilizzando l'ereditarietà di una tabella singola

Per esempio,

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

Ho anche lo stesso problema – maxiperez

+0

Hai aggiunto la colonna 'tipo' nella tabella utenti? Questo è ciò che rende Rails STI funzionante. – Salil

+0

Dimentica la mia taglia, 'current_user' è ben istanziato. –

risposta

4

è esattamente quello che vi serve: http://blog.jeffsaracco.com/ruby-on-rails-polymorphic-user-model-with-devise-authentication

è necessario sostituire il segno nel metodo del percorso nel controller dell'applicazione, spero che aiuta.

+0

Scusate, come ho detto nei commenti + risposta, dimentica la mia taglia, 'current_user' è in effetti ben istanziato dal meccanismo STI. Ho messo la taglia troppo veloce senza testare così lontano;) –

+0

nessun problema, cerco solo di aiutare :) – rbinsztock

+0

Link is dead :-(. –

1

Sarà necessario aggiungere get_some_attribute metodo all'interno User modello

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 

poi, per ignorare nelle tipologie utente sub, in questo modo:

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 

Poi, current_user.get_some_attribute funzionerà come si aspetta , se ti piace leggere di più sui metodi di override in Ruby, puoi leggere a riguardo lo here

Ho aggiunto super poiché presupponevo che avessi qualche logica condivisa in get_some_attribute, poiché chiamerà lo get_some_attribute nel modello Utente, puoi rimuoverlo se non ne hai bisogno.

Buona fortuna!

+0

Ti consiglio di usare solo un tipo di utente e dipendere dai ruoli per determinare cosa fare .. – simo

Problemi correlati