2012-04-04 78 views
2

belongs_to的幾個型號我有幾個型號 - 用戶教師TeacherLeader的Rails 3 - 節能模型,通過嵌套屬性

class User < ActiveRecord::Base                
    attr_accessor :password                
    attr_accessible :user_login,                
        :password, 
        :teacher_attributes, 
        :teacher_leader_attributes 

    has_one :teacher 
    has_one :teacher_leader 

    accepts_nested_attributes_for :teacher_leader 
end 

class Teacher < ActiveRecord::Base 
    belongs_to :user            
    has_one :teacher_leader 
end 

class TeacherLeader < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :teacher 
end 

我想數據TeacherLeader通過嵌套的屬性保存。所以,在用戶模型我加了accepts_nested_attributes_for :teacher_leaderattr_accessible :teacher_leader_attributes

另外我有控制器:

class TeacherLeadersController < ApplicationController  
    def new 
    ... 
    @user = User.new 
    @teacher_leader = @user.build_teacher_leader  
    @teachers_collection = Teacher.all              
            .collect do |t| 
            [ "#{t.teacher_last_name} #{t.teacher_first_name} #{t.teacher_middle_name}", t.id ] 
            end 
    @choosen_teacher = @teachers_collection.first.last unless @teachers_collection.empty? 
    end 

    def create 
    user = User.new(params) 
    user.user_role = "class_head" 

    if user.save 
     flash[:success] = "Successfully created class head!" 
    else 
     flash[:error] = user.errors.full_messages 
    end 
    end 
end 

另外II已視圖TeacherLeader控制器(new.html.erb):

<%= form_for @user, :url => teacher_leaders_url, :html => {:class => "form-horizontal"} do |f| %> 
<%= field_set_tag do %> 
    <%= f.fields_for :teacher_leader do |tl| %> 
     <div class="control-group"> 
     <%= tl.label :teacher_id, "Teacher names", :class => "control-label" %> 
     <div class="controls"> 
     <%= select_tag(:teacher_id, 
         options_for_select(@teachers_collection, @choosen_teacher)) %>   
     </div> 
     </div> 
    <% end %> 

    <div class="control-group"> 
    <%= f.label :user_login, "Login", :class => "control-label" %> 
    <div class="controls"> 
     <%= f.text_field :user_login %> 
    </div> 
    </div> 

    <div class="control-group"> 
    <%= f.label :password, "Pass", :class => "control-label" %> 
    <div class="controls"> 
     <%= f.text_field :password %> 
    </div> 
    </div> 
    <% end %> 

<%= f.submit "Create", :class => "btn btn-large btn-success" %> 

當我試圖保存我的模型,我得到奇怪的錯誤,如「用戶登錄不能爲空」等。我知道用戶模型的驗證會生成它們(我不知道爲什麼,即使有params中的值,我也會得到這樣的錯誤)。我想,是我做錯事的觀點,因爲submiting後,我有這樣的PARAMS

teacher_id: '1' 
user: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    user_login: schoolh_1rF32 
    password: txaqxuTXz96auhX 
commit: Create 
action: create 
controller: teacher_leaders 

但我應該有這樣的事情:

user: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
     user_login: schoolh_1rF32 
     password: txaqxuTXz96auhX 
     teacher_leader_attributes: 
     teacher_id: '1' 

有什麼不對?我能解決這個問題嗎?

UPD:類頭部特寫創建網頁的HTML代碼:

<form accept-charset="UTF-8" action="http://0.0.0.0:3000/teacher_leaders" class="form-horizontal" id="new_user" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="ZKlDTKG8SU8fZuMrUfQoCOSGknOhj651DT2LJDrfliA=" /></div> 
    <fieldset> 

      <div class="control-group"> 
      <label class="control-label" for="user_teacher_leader_attributes_teacher_id">Teacher names</label> 
      <div class="controls"> 

      <select id="teacher_id" name="teacher_id"> 
       <option value="1" selected="selected">Jack P. Tompson </option> 
       <option value="2">Ronald V. Herwud</option>   
      </div> 
      </div> 

     <div class="control-group"> 
     <label class="control-label" for="user_user_login">Login</label> 
     <div class="controls"> 
      <input id="user_user_login" name="user[user_login]" size="30" type="text" /> 
     </div> 
     </div> 

     <div class="control-group"> 
     <label class="control-label" for="user_password">Password</label> 
     <div class="controls"> 
      <input id="user_password" name="user[password]" size="30" type="text" /> 
     </div> 
     </div> 
</fieldset> 
    <input class="btn btn-large btn-success" name="commit" type="submit" value="Create" /> 
</form> 
+0

你能告訴你的形式,呈現HTML? – MikDiet 2012-04-04 13:44:41

+0

@Mik_Die我添加了代碼。你能再次檢查我的帖子嗎? – ExiRe 2012-04-04 13:50:51

回答

1

你不必

<%= select_tag(:teacher_id, 
         options_for_select(@teachers_collection, @choosen_teacher)) %> 

但類似

<%= tl.select(:teacher_id, 
         options_for_select(@teachers_collection, @choosen_teacher)) %>