¿Cómo podría definir las habilidades para varios modelos de dispositivo?¿Cómo integrar CanCan con múltiples modelos de diseño?
Respuesta
El modelo de usuario actual se pasa a la Ability#initialize
, por lo que se acaba de comprobar su clase:
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
Esto funcionó para mí -
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
Supongamos que su aplicación tiene dos Devise- separada modelos de usuario con alimentación llamados User
y Admin
. Esto significa que utiliza métodos como current_user
y current_admin
uno al lado del otro.
Let de más suponer que sólo tiene/quiere una sola clase Ability
, que contiene todas las configuraciones de los permisos CanCan ...
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
Esto es exactamente lo que otros han propuesto, pero hay otro paso que tiene que tomar.
De forma predeterminada, CanCan supone que existe el método current_user
y devolverá un objeto Usuario para compararlo con su configuración Ability
. Sin embargo, nuestros usuarios administradores se pueden encontrar usando current_admin
. Sin decirle a CanCan dónde encontrar los objetos de administración, nunca se revisan y, por lo tanto, nunca obtienen permisos; debemos cambiar los valores predeterminados cuando se trata de un administrador.
Agregue lo siguiente al 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
Ahora nuestra clase Capacidad mirará el objeto de administración, si está disponible, y entrar de nuevo en un usuario normal cuando no está presente.
Un mayor desarrollo nos permite mover permisos de administrador en su propia clase Capacidad separada ...
def current_ability
if admin_signed_in?
@current_ability ||= AdminPowers.new(current_admin)
else
@current_ability ||= Ability.new(current_user)
end
end
Para obtener más información, consulte Changing Defaults en el Wiki. Felicitaciones a Stefan por señalarme el artículo correcto.
FYI - CanCan está muerto, viva CanCanCan! Actualizado con correcciones de errores y nuevas funciones. Los mismos espacios de nombres, por lo que solo se trata de un reemplazo de gemas en su Gemfile.
gem 'cancancan', '~> 1.8'
después de buscar finalmente encontré la respuesta completa – coderVishal
- 1. CanCan y controladores sin modelos
- 2. ¿Cómo hacer la paginación con cancan?
- 3. will_paginate con múltiples modelos (rieles)
- 4. rieles Can Can Capacidad de clase para múltiples modelos Idear
- 5. Patrón de diseño para integrar Rails con un servidor Comet
- 6. ASP.NET MVC - Ver con múltiples modelos
- 7. Autorización de administración con CanCan
- 8. Rabl Colección de modelos múltiples
- 9. ¿Cómo integrar NSURLConnection con UIProgressView?
- 10. Backbone/RequireJS y modelos múltiples
- 11. Permisos de serialización (por ejemplo, CanCan) con active_model_serializers
- 12. ASP.NET MVC - Múltiples modelos en carpetas de formularios y modelos
- 13. PHP y MVC, modelos múltiples
- 14. Uso de esquemas PostgreSQL múltiples con modelos Rails
- 15. Convenciones CSS/Modelos de diseño de código
- 16. Cómo integrar Redis con SQLAlchemy
- 17. Cómo integrar ezComponents con Magento
- 18. Cómo integrar NHibernate con Lucene.Net
- 19. ¿Cómo integrar CKFinder con CKEditor?
- 20. iPhone Core Migración de datos con múltiples modelos
- 21. ¿Cómo integrar websocket con emberjs?
- 22. ¿Un controlador con múltiples modelos? ¿Estoy haciendo esto correctamente?
- 23. Paginate Múltiples modelos en Kaminari
- 24. Autorización de contexto con el uso de CanCan
- 25. Cancan accessible_by
- 26. de manchas solares con múltiples modelos (en Rails)
- 27. Diseñar/Cancan/Rolify juntos
- 28. Autorización de rieles con CanCan Problema
- 29. Integrar Spring con IntelliJ
- 30. Integrar solr con mySql
Gracias Stefan. Desafortunadamente, no parece estar funcionando. Aplica solo el caso del Usuario y de otro modo, pero no el Administrador. Cada vez que inicio sesión como administrador solo tengo privilegios de invitado. Probablemente estoy haciendo algo mal, pero no puedo entenderlo. – user1464499
Tal vez 'Ability # initialize' no se llame para su administrador. Agregue un poco de registro y eche un vistazo a [Cambiar los valores predeterminados] (https://github.com/ryanb/cancan/wiki/Changing-Defaults). – Stefan