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="✓" /><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>
Können Sie Ihre Form zeigen, gerendert in HTML? – MikDiet
@Mik_Die Ich habe Code hinzugefügt. Kannst du bitte nochmal meinen Beitrag sehen? – ExiRe