Come definirei le capacità per diversi modelli di dispositivi?Come integrare CanCan con più modelli di sviluppo?
risposta
Il modello utente corrente viene passato al Ability#initialize
, in modo da poter resta che verificare la classe:
class Ability
include CanCan::Ability
def initialize(model)
case model
when Admin
can :manage, :all
when User
can :create, Comment
can :read, :all
else
can :read, :all
end
end
end
Questo ha funzionato per me -
class Ability
include CanCan::Ability
def initialize(user)
if user.is_a?(Admin)
can :manage, :all
elsif user.is_a?(User)
can :create, Comment
can :read, :all
else
can :read, :all
end
end
end
Supponiamo vostra applicazione ha due Devise- separata modelli utente alimentati chiamati User
e Admin
. Ciò significa che si utilizzano metodi come current_user
e current_admin
affiancati.
Diamo inoltre supporre che avete/volete un unico Ability
classe, che contiene tutte le impostazioni di autorizzazione Cancan solo ...
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
case user
when User
can :create, Comment
can :read, :all
when Admin
can :manage, :all
end
end
end
Questo è esattamente ciò che gli altri hanno proposto, ma c'è un altro passo che devi prendere.
Per impostazione predefinita, CanCan presuppone che il metodo current_user
esista e restituisca un oggetto Utente da confrontare con le impostazioni Ability
. Tuttavia, i nostri utenti amministratori possono essere trovati utilizzando current_admin
. Senza dire a CanCan dove trovare gli oggetti di amministrazione, essi non vengono mai esaminati e quindi non ottengono mai le autorizzazioni; dobbiamo cambiare i valori di default quando ci occupiamo di un amministratore.
Aggiungere il seguente alla application_controller.rb
...
def current_ability
if admin_signed_in?
@current_ability ||= Ability.new(current_admin)
else
@current_ability ||= Ability.new(current_user)
end
end
Ora la nostra classe Ability esaminerà l'oggetto Admin, se disponibile, e ripiegare su un utente normale quando nessuno è presente.
ulteriore sviluppo ci permette di spostare le autorizzazioni di amministratore nella propria classe diversa abilità ...
def current_ability
if admin_signed_in?
@current_ability ||= AdminPowers.new(current_admin)
else
@current_ability ||= Ability.new(current_user)
end
end
Per ulteriori informazioni, vedere Changing Defaults nel Wiki. Complimenti a Stefan per avermi indicato l'articolo corretto.
FYI - CanCan è morto, lunga vita CanCanCan! Aggiornato con correzioni di bug e nuove funzionalità. Stessi spazi dei nomi, quindi è solo una sostituzione gemma drop-in nel tuo Gemfile.
gem 'cancancan', '~> 1.8'
dopo la ricerca ho finalmente trovato la risposta completa – coderVishal
- 1. CanCan e controller senza modelli
- 2. Rails 3.1 - Sviluppo con i modelli montabili
- 3. Come utilizzare CanCan con i controller gem?
- 4. Come integrare Flot con AngularJS?
- 5. Modelli di sviluppo e progettazione GWT
- 6. come posso integrare più di 5 certificati push con Parse?
- 7. Autorizzazione consapevole del contesto con CanCan
- 8. Quanti modelli di sviluppo Asyncrono in .NET?
- 9. CanCan spiegazione di load_and_authorize_resource
- 10. Associazione FactoryGirl con più modelli
- 11. Come integrare asana con intellij
- 12. direttiva angolare con più modelli
- 13. Come integrare Wordpress con Cakephp?
- 14. Regni multipli con più modelli di dati
- 15. Collezione Backbone con più modelli?
- 16. Come utilizzare diversi authentication_keys per due modelli di sviluppo?
- 17. Qt foreach con modelli con più parametri
- 18. Ember.js: Come integrare i componenti del test che interagiscono con i modelli di dati ember
- 19. Come integrare Redis con SQLAlchemy
- 20. Come integrare rubocop con Rake?
- 21. Come integrare NHibernate con Lucene.Net
- 22. Integrare Galleriffic con Lightbox, come?
- 23. Come integrare Eslint con jenkins?
- 24. Come integrare Jsoup con WebDriver?
- 25. Come integrare CKFinder con CKEditor?
- 26. Come integrare Karma con TeamCity
- 27. Come integrare Crashlytics con Github?
- 28. Come integrare Appium con C#?
- 29. Come integrare websocket con emberjs?
- 30. Come integrare MongoDB con Solr?
Grazie Stefan. Sfortunatamente, non sembra funzionare. Si applica solo il caso Utente e altro ma non l'Amministratore. Ogni volta che accedo come amministratore, ho solo privilegi di ospite. Probabilmente sto facendo qualcosa di sbagliato ma non riesco a capirlo. – user1464499
Forse 'Ability # initialize' non viene chiamato per l'amministratore. Aggiungi un po 'di registrazione e controlla [Modifica dei valori predefiniti] (https://github.com/ryanb/cancan/wiki/Changing-Defaults). – Stefan