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!

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top