2

Ich habe einige Modelle - Benutzer, Lehrer und TeacherLeader.Rails 3 - Sparmodell, das über verschachteltes Attribut einige Modelle belongs_to

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 

Ich möchte Daten in TeacherLeader über verschachtelte Attribute speichern. Also, in Benutzer Modell ich hinzugefügt accepts_nested_attributes_for :teacher_leader und attr_accessible :teacher_leader_attributes.

Auch ich habe Controller:

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 

Auch ii haben Ansicht für TeacherLeader Controller (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" %> 

Wenn ich versuche zu Speichern Sie meine Modelle, ich bekomme seltsame Fehler wie "Benutzeranmeldung kann nicht leer sein" und andere. Ich weiß, dass Validierungen von Benutzermodellen sie generieren (ich weiß nicht warum, ich bekomme solche Fehler, selbst wenn Werte in params haben). Ich nehme an, dass ich im Hinblick auf etwas falsch machen, denn nach submiting i solche params haben:

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

Aber ich sollte etwas wie dieses:

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

Was ist falsch? Kann ich das reparieren?

UPD: HTML-Code für die Erstellung Seitenklasse Kopf:

<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

Können Sie Ihre Form zeigen, gerendert in HTML? – MikDiet

+0

@Mik_Die Ich habe Code hinzugefügt. Kannst du bitte nochmal meinen Beitrag sehen? – ExiRe

Antwort

1

Sie müssen nicht

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

aber so etwas wie

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