Comment toujours définir une valeur pour le champ de compte dans Rails?
-
16-09-2019 - |
Question
Je travaille sur un multi-utilisateurs, multi-App compte où 1 compte peut avoir n utilisateurs. Il est très important que chaque utilisateur ne peut accéder aux informations de son compte. Mon approche est d'ajouter un account_id à chaque modèle dans la base de données et que d'ajouter un filtre dans chaque contrôleur pour sélectionner uniquement les objets avec le account_id actuel. Je vais utiliser le plug-in d'autorisation.
Cette approche est une bonne idée?
Quelle est la meilleure façon de mettre toujours le account_id pour chaque objet qui est créé sans écrire
object.account = @current_account
dans chaque CREER action? Peut-être un filtre?
Aussi je ne suis pas sûr de la meilleure façon de mettre en œuvre le filtre pour les options choisies. Je besoin de quelque chose comme un état général. Peu importe ce qui apparaît d'autre dans l'instruction SQL, il y a toujours un « OU = account_id XY »
Merci pour votre aide!
La solution
Ceci est similaire à un User.has_many: scénario de courriels. Vous ne voulez pas l'utilisateur de voir d'autres e-mails des peuples en changeant l'ID dans l'URL, donc vous faites ceci:
@emails = current_user.emails
Dans votre cas, vous pouvez probablement faire quelque chose comme ceci:
class ApplicationController < ActionController::Base
def current_account
@current_account ||= current_user && current_user.account
end
end
# In an imagined ProjectsController
@projects = current_account.projects
@project = current_account.projects.find(params[:id])
Autres conseils
Je sais, je sais, si vous accédez à des variables de session ou variables d'instance dans votre modèle vous ne comprenez pas le modèle MVC et « devrait revenir à PHP ». Mais encore, cela pourrait être très utile si vous avez - comme nous - beaucoup de contrôleurs et d'actions où vous ne voulez pas toujours d'écrire @ current_account.object.do_something (pas très sec)
.La solution que je trouve est très simple:
Etape 1: Ajouter votre current_account à Thread.current, donc par exemple
class ApplicationController < ActionController::Base
before_filter :get_current_account
protected
def get_current_account
# somehow get the current account, depends on your approach
Thread.current[:account] = @account
end
end
Étape 2: Ajouter une méthode current_account à tous vos modèles
#/lib/ar_current_account.rb
ActiveRecord::Base.class_eval do
def self.current_account
Thread.current[:account]
end
end
Étape 3: Voilá, dans vos modèles que vous pouvez faire quelque chose comme ceci:
class MyModel < ActiveRecord::Base
belongs_to :account
# Set the default values
def initialize(params = nil)
super
self.account_id ||= current_account.id
end
end
Vous pouvez aussi travailler avec quelque chose comme le rappel de before_validation dans active_record puis faire une validation que le compte est toujours défini.
pourrait être utilisé la même approche si vous voulez toujours ajouter current_user à chaque objet créé.
Que pensez-vous?
Pour répondre à votre deuxième question, consultez le nouveau default_scope
Rails 2.3 en fonction.
Je comprends que vous ne voulez pas à se soucier de la portée votre compte tous les temps. Soyons honnête, il est une douleur dans le un **.
Pour ajouter une magie de bits et ont cette portée fait donner en toute transparence un oeil à la perle suivante
http://gemcutter.org/gems/account_scopper
Hope this helps,
- Sébastien Grosjean - ZenCocoon