2017-07-15 5 views
0

Actuellement, nous utilisons deux tables séparées pour les utilisateurs et les rôles.Comment personnaliser concevoir pour stocker des informations de rôle utilisateur dans une session?

J'utilise pundit pour l'autorisation et concevoir pour l'authentification.

À plusieurs endroits, je fais current_user.roles pour aller chercher les rôles de l'utilisateur. Surtout dans les fichiers de politiques Pundit.

Je souhaite stocker les rôles utilisateur dans la session lorsque l'utilisateur se connecte. Ainsi, je n'interrogerai pas DB à chaque fois pour récupérer les rôles.

Une solution rapide sera grandement appréciée?

Répondre

3

Depuis Pundit ont aucune option, pour passer session ou d'autres paramètres, à l'exception current_user et la vérification entity, vous pouvez utiliser Rails.cache à la place:

# app/models/user.rb 
class User < ActiveRecord::Base 
    # ... 
    def cached_roles 
    Rails.cache.fetch "user.#{self.id}.roles" do 
     roles.pluck(:name) 
    end 
    end 

    def clear_cached_roles 
    Rails.cache.delete "user.#{self.id}.roles" 
    end 
end 


# app/policies/post_policy.rb 
class PostPolicy < ApplicationPolicy 
    # ... 

    def admin? 
    user.cached_roles.include? 'admin' 
    end 

    def reader? 
    user.cached_roles.include? 'reader' 
    end 
end 

Pour Concevoir pour mettre en cache les rôles actuels, vous devez remplacer la session_controller de Devise

# app/controllers/users/sessions_controller.rb 
class Users::SessionsController < Devise::SessionsController 
    def create 
    super 
    current_user.cached_roles 
    end 

    def destroy 
    current_user.clear_cached_roles 
    super 
    end 
end 

J'ai créé ce demo rails application, vous pouvez jouer avec: voir ma variante de solution avec Rails.cache dans rails_cache_solution branche ou dans la demande de traction.

Voir aussi ces fichiers pour plus de détails:

  • app/controllers/users/sessions_controller.rb
  • spec/controllers/posts_controller_spec.rb
  • app/policies/post_policy.rb
  • app/models/user.rb
  • README.md