Rails-Neuling hier.
Ich habe 2 Modelle: Ziel und Beobachtung
Das Ziel funktioniert gut. Ich habe ein Gerüst für Observation erstellt, etwa so:
rails generate scaffold Observation date:date target:references
app/models/observation.rb sagt also:
class Observation < ActiveRecord::Base
belongs_to :target
end
Dann habe ich app/models/target.rb bearbeitet:
class Target < ActiveRecord::Base
has_many :observations
end
Das Gerüst erstellt app/views/observations/_form.html.erb, das Folgendes enthält:
<div class="field">
<%= f.label :target %><br />
<%= f.text_field :target %>
</div>
Und app/controllers/observation_controller.rb, die enthält:
def create
@observation = Observation.new(params[:observation])
Dann gehe ich zum Erstellen einer neuen Beobachtung. Ich gebe ein Datum und die ID eines Ziels in das Zielfeld ein. Wenn ich abschicke, erhalte ich diesen Fehler im Browser:
ActiveRecord::AssociationTypeMismatch in ObservationsController#create
Target(#2190392620) expected, got String(#2148287480)
Es sieht so aus, als würde das Gerüst etwas aufbauen, das funktionieren würde. Aber der Fehler macht Sinn. Es wird die ID des Ziels anstelle des Ziels selbst empfangen. Also ich bearbeitet app/controllers/observation_controller.rb zu sagen:
def create
@target = Target.find(params[:observation][:target])
@observation = @target.observations.create(:date => params[:observation][:date])
Jetzt wird der Beobachtungsdatensatz mit dem Verweis auf das Ziel erstellt. Aber das Datumsfeld ist leer.
Mir ist klar, dass dies vielleicht eine dumme Anfänger- oder RTFM-Frage ist, aber ich wäre wirklich dankbar für einen Hinweis in die richtige Richtung. Danke!
Hier ist der vollständige Inhalt des Formulars, nachdem es an die erhaltene Antwort angepasst wurde.
<%= form_for(@observation) do |f| %>
<% if @observation.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@observation.errors.count, "error") %> prohibited this observation from being saved:</h2>
<ul>
<% @observation.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :date %><br />
<%= f.date_select :date %>
</div>
<div class="field">
<%= f.label :target %><br />
<%= f.collection_select :target_id, Target.all, :id, :name %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>