Wie würde ich bei der Definition von Fähigkeiten für mehrere Gerätemodelle vorgehen?Wie kann CanCan mit mehreren Gerätemodellen integriert werden?
Antwort
Das aktuelle Benutzer Modell zum Ability#initialize
übergeben wird, so kann man seine Klasse einfach überprüfen:
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
Das ist für mich gearbeitet -
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
Lassen Sie sich Ihre Anwendung separate Devise- hat zwei übernehmen powered Benutzermodelle genannt User
und Admin
. Das bedeutet, dass Sie Methoden wie current_user
und current_admin
nebeneinander verwenden.
Lassen Sie uns weiter annehmen, dass Sie nur haben/wollen eine einzige Ability
-Klasse, die alle Ihre CanCan Berechtigungseinstellungen enthält ...
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
Das ist genau das, was andere vorgeschlagen haben, aber es ist ein weiterer Schritt, den Sie müssen nehmen.
CanCan geht standardmäßig davon aus, dass die Methode current_user
existiert und gibt ein Benutzerobjekt zurück, das mit Ihren Ability
Einstellungen verglichen werden kann. Unsere Admin-Benutzer können jedoch unter current_admin
gefunden werden. Ohne CanCan zu sagen, wo Admin-Objekte zu finden sind, werden sie nie überprüft und erhalten somit nie Berechtigungen; müssen wir die Standardeinstellungen ändern, wenn wir mit einem Admin umgehen.
Fügen Sie den folgenden zu 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
Jetzt im Admin-Objekt unserer Fähigkeit Klasse aussehen wird, wenn ein solcher vorhanden ist, und wieder auf einem normalen Benutzer fallen, wenn keiner vorhanden ist.
Weiterentwicklung ermöglicht es uns, Admin-Berechtigungen in ihre eigene separate Fähigkeit Klasse ...
def current_ability
if admin_signed_in?
@current_ability ||= AdminPowers.new(current_admin)
else
@current_ability ||= Ability.new(current_user)
end
end
Für weitere Informationen zu bewegen, sehen Changing Defaults im Wiki. Kudos zu Stefan für mich auf den richtigen Artikel.
FYI - CanCan ist tot, es lebe CanCanCan! Aktuell mit Bugfixes und neuen Funktionen. Die gleichen Namespaces, also ist es nur ein Drop-in-Juwel Ersatz in Ihrer Gemfile.
Nach der Suche fand ich endlich die vollständige Antwort – coderVishal
- 1. Kann Flash mit SQL integriert werden?
- 2. Wie kann CodeMirror in KnockoutJS integriert werden?
- 3. Wie kann NPI Lookup integriert werden?
- 4. Wie kann MoinMoin in Pyramide integriert werden?
- 5. Wie kann Acts-als-Taggable-on in RailsAdmin integriert werden?
- 6. Wie kann NAnt mit Visual Studio integriert werden?
- 7. Wie kann Autofac mit WepApi 2 und Owin integriert werden?
- 8. Wie kann Azure ACS mit lokalen (benutzerdefinierten) STS integriert werden?
- 9. Wie kann ondrive online mit API integriert werden?
- 10. Kann CanCan: verwalten,: alle außer einer oder mehreren Methoden?
- 11. Kann Doxygen in Netbeans C++ integriert werden?
- 12. Kann Dropwizard Metrics in Scalatra integriert werden?
- 13. Kann JaVers in Hibernate integriert werden?
- 14. Kann MOSS 2007 in mehrere LDAP/AD-Stores integriert werden?
- 15. Spring Boot Data kann nicht mit Neo4j integriert werden
- 16. Wie kann SharpArchitecture und NHibernate.Search über Fluent.NHibernate.Search integriert werden?
- 17. Wie kann Google Earth in Flex integriert werden?
- 18. Wie kann Google Checkout in meine Android App integriert werden?
- 19. Wie kann Delphi in Active Directory integriert werden?
- 20. Wie kann die Codegenerierung in eine C# -Lösung integriert werden?
- 21. Wie können EventMachine & Rails integriert werden?
- 22. Wie kann ImageMagick erfolgreich in iOS integriert werden?
- 23. Wie sollten Fehlerverfolgung und Hilfetickets integriert werden?
- 24. Wie kann Google Spreadsheet in Google Kalender integriert werden?
- 25. Wie kann Google Kalender von jquery mobile integriert werden?
- 26. Wie kann GraphView in mein Projekt integriert werden?
- 27. Wie kann Token in die azure API-Verwaltung integriert werden?
- 28. mit Session-Variablen in CanCan mit ActiveAdmin
- 29. Mit Devise/Cancan/Rolify zusammen
- 30. Rails Authorization mit CanCan Problem
Danke Stefan. Leider scheint es nicht zu funktionieren. Es gilt nur der Benutzerfall und sonst nicht der Admin. Immer wenn ich mich als Administrator anmelde, habe ich nur Gastprivilegien. Wahrscheinlich mache ich etwas falsch, aber ich kann nicht herausfinden. – user1464499
Vielleicht wird 'Fähigkeit # initialisieren' nicht für Ihren Administrator aufgerufen. Fügen Sie eine Protokollierung hinzu und überprüfen Sie [Standardeinstellungen ändern] (https://github.com/ryanb/cancan/wiki/Changing-Defaults). – Stefan