2010-10-21 14 views
1

J'ai un formulaire imbriqué qui est basé sur le modèle suivant - Une leçon a beaucoup de questions, chaque question a beaucoup de réponses, et les réponses appartiennent aux utilisateurs .Rails Forme imbriquée - Filtrer par utilisateur actuel, questions-réponses-utilisateurs

Je développe un formulaire imbriqué, de sorte qu'un nouvel utilisateur puisse revoir les questions et poster des réponses. Si un utilisateur a entré des réponses dans le passé, je veux que celles-ci apparaissent; sinon afficher les champs vides. Je ne veux pas non plus que l'utilisateur voie les réponses de quelqu'un d'autre. Donc, je n'arrive pas à comprendre comment afficher uniquement les réponses pour l'utilisateur actuellement connecté. J'ai créé un named_scope, mais cela ne fonctionne pas (voir mon action d'édition). À l'heure actuelle, lors de l'édition, je vois les réponses pour tous les utilisateurs sous chaque question. Pour créer la vue, j'ai suivi l'exemple de formulaire imbriqué de Railscast 196.

Nous vous remercions de votre aide. Voici le code montrant mes modèles et le contrôleur de leçons.

class Lesson < ActiveRecord::Base 
     has_many :questions, :dependent => :destroy 
     accepts_nested_attributes_for :questions, :allow_destroy => true, 
:reject_if => proc { |a| a['data'].blank? } 
    end 

    class Question < ActiveRecord::Base 
     belongs_to :lesson 
     has_many :answers 
     accepts_nested_attributes_for :answers, 
:reject_if => lambda { |a| a['data'].blank? }, :allow_destroy => true 
    end 

    class Answer < ActiveRecord::Base 
     belongs_to :question 
     belongs_to :user 
     named_scope :by_user, 
lambda {|user| {:conditions => ["user_id = ?", user]}} 
    end 

    class User < ActiveRecord::Base 
     has_many :answers 
     accepts_nested_attributes_for :answers, 
:reject_if => lambda { |a| a['name'].blank? }, :allow_destroy => true 
    end 

LESSONS Controller: 



def edit 
    @lesson = Lesson.find(params[:id]) 
    if current_user_admin == 99 # show blank question field if admin user 
     @questions = @lesson.questions.build(:user_id => current_user) 
    end 
    @lesson.questions.each do |question| 
     # if there are no answers for this user 
     if question.answers.by_user(current_user.id).size != 1 
     # if the current user is not admin 
     if current_user_admin != 99 
      question.answers.by_user(current_user.id).build(:user => current_user) 
     end 
     end 
    end 
    end 
+0

Y at-il un moyen d'ajouter un filtre au modèle? Je voudrais pouvoir mettre à jour mon modèle Question pour dire has_many: réponses,: conditions => ["user_id =?, Current_user.id] <- je réalise que current_user n'appartient pas au modèle. J'ai dans ce cas? – Alex

Répondre

0

Cette portée nommée semble fonctionner correctement. Êtes-vous sûr que les enregistrements de réponses dans votre base de données ont un user_id défini correctement?

Je pense que le hachage que vous obtenez dans le reject_if lambda a des touches qui sont chaînes plutôt que des symboles pour que vos modèles imbriqués champs peuvent être rejetés en silence se.

+0

Merci Matt J'ai corrigé les instructions reject_if Le code ne fonctionne toujours pas Il y a peut-être un exemple auquel quelqu'un peut me pointer.J'aime Ryan's railscast 196 sur la création de l'enquête, mais il manque un modèle d'utilisateur J'ai besoin d'un ensemble d'utilisateurs pour créer des leçons et des questions et puis un autre pour répondre à ces questions – Alex

0

Iv a détecté un problème avec le code dans votre contrôleur. Vous construisez un objet de réponse à l'intérieur de chaque bloc qui itère à travers les réponses, seulement si cette réponse est nulle, ce qui n'arrivera jamais.

Je pense que votre pas ce que vous essayez de faire dans votre contrôleur est quelque chose comme:

def edit 
    @lesson = Lesson.find(params[:id]) 
    @lesson.questions.each do |question| 
    if question.answers.by_user(current_user.id).empty? 
     question.answers.build(:user => current_user) 
    end 
    end 
end 
+0

Salut Matt, Merci pour votre aide, mais cela ne résout pas mon problème.Quand je vais modifier la leçon, je vois toujours des réponses pour les autres utilisateurs, pas seulement l'utilisateur actuellement connecté, j'ai posté le code mis à jour. – Alex