2011-09-17 2 views
2

StudentReferrals을 편집하기위한 양식을 만드는 데 문제가 있습니다. 각 학생에게는 이름/생일/학생 신분과 같은 기본 정보가 있습니다. 그 정보 이외에, 학생들은 수업 목록을 가져 오기 위해 참조됩니다. 누군가가 학생 정보를 작성하고 학생이 취해야하는 수업을 최대 10 개까지 선택할 수있는 양식을 갖고 싶습니다. 수업 외에도 각 "학생 + 과정"콤보에는 학생이 취해야하는 학점의 수를 나타내는 credits_required 필드가 있습니다.레일에서 중첩 된 오브젝트에 대한 양식

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 

그리고 나는처럼 생성/편집 학생 추천에 형태를 갖는다 :

학생이 취할 수있는 클래스의 목록은 내가 3 개 모델을 가지고있는 Course 모델

에서 온다 다음 :

<%= 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 %> 

내 문제는 유효성 검사를 사용하여 끔찍한 해킹을하지 않고도 이러한 레코드를 만들거나 편집 할 수 없다는 것입니다. 나는 course1에서 course9까지의 숫자가 attr_accessible이고, after_create 매크로에서 사용하는 크레딧은 동일합니다. 그러나이 과정에서 확인 오류를 볼 수 없게됩니다 (예 : 크레딧을 입력하지 않은 경우)

accepts_nested_attributes_for :student_referral_courses을 사용해 보았지만 원하는 결과를 얻지 못했습니다. 나는 레일스 방식으로이 작업을하고 싶다. 나는 끔찍한 해킹을하고있는 것처럼 느낀다.

+0

을이 도움이 될 수 있습니다 – jefflunt

+0

@normalocity http://railscasts.com/episodes/73-complex-forms-part-1 - 나는 그것을 시도했지만, 나는 그것을 작동시키지 못했습니다. –

답변

0

시도 has_many를 추가 :의를 통해 과정의 IE

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

+0

업데이트 됨 2011-11-22 –