2011-09-17 4 views
2

Je rencontre des difficultés pour créer un formulaire à modifier StudentReferrals. Chaque étudiant a quelques informations de base comme nom/anniversaire/studentid. En plus de cette information, les étudiants sont invités à prendre une liste de cours. Je veux avoir un formulaire qui permet à quelqu'un de remplir les informations sur l'étudiant, puis sélectionner jusqu'à 10 classes que l'étudiant est tenu de prendre. En plus des classes, chaque combo "Étudiant + Cours" a un champ credits_required qui indique le nombre de crédits d'une classe que l'étudiant doit suivre.Formulaires pour les objets imbriqués dans Rails

La liste des classes qu'un étudiant peut prendre provient du modèle Course

je 3 modèles:

class StudentReferral < ActiveRecord::Base 
    has_many :student_referral_courses, :dependent => :destroy 
    has_many :courses, :through => :student_referral_courses 

    # Fields: name, studentid, advisor_name, birthday 
end 

class StudentReferralCourse < ActiveRecord::Base 
    belongs_to :student_referral 
    belongs_to :course 

    validates_presence_of :credits_required 

    # Fields: (student_referral_id, course_id, credits_required) 

    attr_accessor :course1, ..., :course9 
    attr_accessor :credits1, ..., :credits9 

    after_create :add_courses 

    def add_courses 

    self.student_referral_courses.destroy_all 

    unless self.course1.blank? 
     self.student_referral_courses.create! :course_id => self.course1, :student_referral_id => self.id, :credits_required => self.credits1 
    end 
    unless self.course2.blank? 
     self.student_referral_courses.create! :course_id => self.course2, :student_referral_id => self.id, :credits_required => self.credits2 
    end 
    ... 
end 

class Course < ActiveRecord::Base 
    # Fields: department, name 
end 

Et j'ai un formulaire créé/modifier les références des étudiants qui ressemble à la suivant:

<%= form_for(@student_referral) do |f| %> 
    <% if @student_referral.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@student_referral.errors.count, "error") %> prohibited this student referral from being saved:</h2> 

     <ul> 
     <% @student_referral.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 



<fieldset class="form"> 
<legend>Student Information</legend> 
<table cellpadding="3" cellspacing="0" border="0" class="vert"> 
<tr><th class="subr"><%= f.label :studentid %></th><td><%= f.text_field :studentid %></td></tr> 
<tr><th class="subr"><%= f.label :name %></th><td><%= f.text_field :name %></td></tr> 
<tr><th class="subr"><%= f.label :birthday %></th><td><%= f.date_select :birthday, :start_year => 1990 %></td></tr> 
<tr><th class="subr"><%= f.label :advisor %></th><td><%= f.text_field :advisor %></td></tr> 
</table> 
</fieldset> 


<fieldset class="form"> 
<legend>Course Information</legend> 
<span>You <b>MUST</b> select the credits required for each course.</span> 
<ol> 
<li><%= select(:student_referral, :course1, Course.all(:order => "dept,name ASC").collect {|p| [ "#{p.dept}: #{p.name}", p.id ] }, { :include_blank => '' })%> 
    <%= select_tag 'student_referral[credits1]', options_for_select(['Select One',5.0,4.5,4.0,3.5,3.0,2.5,2.0,1.5,1.0,0.5]) %></li> 
<li><%= select(:student_referral, :course2, Course.all(:order => "dept,name ASC").collect {|p| [ "#{p.dept}: #{p.name}", p.id ] }, { :include_blank => '' })%> 
    <%= select_tag 'student_referral[credits2]', options_for_select(['Select One',5.0,4.5,4.0,3.5,3.0,2.5,2.0,1.5,1.0,0.5]) %></li> 
    ... 
</ol> 
</fieldset> 

<%= f.submit :class => "l-button black" %> 

<% end %> 

Mon problème est que je ne peux pas sembler créer ou modifier l'un de ces dossiers sans faire un terrible bidouille en utilisant la validation. J'ai 10 champs attr_accessible pour course1 à course9 et même pour les crédits que j'utilise sur une macro after_create. Cependant, cela ne me laisse pas voir les erreurs de validation du cours (comme s'ils ne mettent pas de crédits)

J'ai essayé d'utiliser accepts_nested_attributes_for :student_referral_courses mais je n'arrive pas à l'obtenir pour faire ce que je veux. Je veux vraiment faire cela de la manière Rails et j'ai l'impression de faire un hack terrible.

+0

Cela pourrait être utile: http://railscasts.com/episodes/73-complex-forms-part-1 – jefflunt

+0

@normalocity - I J'ai essayé, mais je n'arrivais pas à le faire fonctionner. –

Répondre

0

Essayez d'ajouter has_many: par son au cours iE

class Course < ActiveRecord::Base
has_many :student_referrals, :dependent => :destroy
has_many :student_referral_courses, :through => :student_referrals
end

+0

Mise à jour le 22/11/2011 –

Questions connexes