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.
Cela pourrait être utile: http://railscasts.com/episodes/73-complex-forms-part-1 – jefflunt
@normalocity - I J'ai essayé, mais je n'arrivais pas à le faire fonctionner. –