2010-01-26 5 views
0

Je continue à obtenir l'erreur suivante:définir dynamiquement named_scope basé sur current_user

You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating nil.size

Sur la base de l'utilisateur actuel, lorsqu'ils naviguent sur une page, je veux les limiter à ce qu'ils peuvent voir en fonction de leur site . Le problème est qu'il n'y a pas d'association directe entre le site et la table utilisateur. Un contact a un seul utilisateur (les informations utilisateur sont stockées dans la variable current_user). Un site a beaucoup de contacts. Et un site a_many étudiants, où la table des étudiants a une clé étrangère de site_id. Il existe donc un lien entre les étudiants et le site, de sorte que lorsque l'utilisateur actuel accède à la page des étudiants, il ne peut voir que les étudiants du même site que lui. Je peux le faire en codant en dur un nombre dans un named_scope pour afficher seulement les étudiants pour le site de current_user. Mais les différents utilisateurs appartiendront à des sites différents et, une fois connecté, le site auquel ils sont associés changera. C'est le problème - pour définir dynamiquement cette valeur dans un named_scope. Voilà ce que j'ai:

StudentsController

def index_scoper 
    if current_user.role_id == 8 
    super.site_staff_limit while current_user[:site_id] 
    # The problem is the user table has no site_id. There is no direct 
    # link between the users table and sites table. However, there is 
    # a link between users and contacts and then site and contacts and 
    # then site and students, where students table has site_id. 
    else 
    super.with_state.with_site 
    end 
end 

Modèle étudiant

named_scope :site_staff_limit, lambda {|site_id| {:conditions => {:site_id => site_id}}} 

Merci pour toutes suggestions.

relation entre les tables:

utilisateurs: contact_id Contact: clé primaire, contactable_id, contactable_type site: clé primaire étudiant: SITE_ID

modèle utilisateur belongs_to: Contact

Contactez modèle has_one: user appartient à: contactable,: polymorphique => true,: dependent =>: destroy

modèle du site has_many: contacts,: as =>: contactables has_many: étudiants

Les élèves font belongs_to: Site

Cela limite avec succès les étudiants par site: StudentsController def index_scoper si current_user .role_id == 8 super.site_staff_limit autre super.with_state.with_site fin fin

Les élèves font named_scope: site_staff_limit,: conditions => {: site_id => 1}

Le problème est différent les utilisateurs appartiennent à des sites différents, de sorte qu'ils ne peuvent les dossiers des étudiants d'accès du site auquel ils appartiennent. J'ai de la difficulté à faire en sorte que named_scope soit assez dynamique pour accomplir cela.

+1

Avez-vous une chance de formater un peu mieux votre code? Merci. – Eli

Répondre

1

Vous pourriez être en mesure de mettre en place un lien entre les utilisateurs et les sites, avec une relation: through.

Le code que vous avez fourni fonctionne-t-il? Y a-t-il une erreur qui se produit?

+0

J'ai essayé des dizaines de solutions, allant de nombreuses erreurs différentes. Par exemple, j'ai essayé de créer trois named_scopes puis de les référencer dans le controller: super.current_user (: contact_id) .contacts (: contactable_id,: contactable_type) .site_staff_limit (: site_id) Mais cela donne une erreur d'association. – JohnMerlino

+0

Accrochez-vous ... il semble que vous essayez d'appeler une étendue sur le contrôleur en utilisant "super"? –

+0

oui super contient les informations des étudiants. Il est hérité d'une méthode dans le restfulcontroller créé dans le répertoire lib, d'où le contrôleur students hérite. Donc, super se réfère au modèle d'étudiant. – JohnMerlino