开发者

Rails 3 date field is blank after form submit

Rails newbie here.

I have 2 models: Target and Observation

Target works fine. I generated scaffolding for Observation, like this:

rails generate scaffold Observation date:date target:references
开发者_运维技巧

So app/models/observation.rb says:

class Observation < ActiveRecord::Base
  belongs_to :target
end

Then I edited app/models/target.rb:

class Target < ActiveRecord::Base
  has_many :observations
end

The scaffolding created app/views/observations/_form.html.erb which includes:

<div class="field">
  <%= f.label :target %><br />
  <%= f.text_field :target %>
</div>

And app/controllers/observation_controller.rb which includes:

def create
  @observation = Observation.new(params[:observation])

I then go to create a new Observation. I enter a date and the ID of a target in the target field. When I submit, I get this error in the browser:

ActiveRecord::AssociationTypeMismatch in ObservationsController#create
Target(#2190392620) expected, got String(#2148287480)

Seems like the scaffolding would set up something that would work. But the error makes sense. It's receiving the ID of the Target instead of the Target itself. So I edited app/controllers/observation_controller.rb to say:

def create
  @target = Target.find(params[:observation][:target])
  @observation = @target.observations.create(:date => params[:observation][:date])

Now it creates the Observation record, with the reference to the Target. But the date field is blank.

I realize this may be a dumb newbie or RTFM question, but I'd really appreciate a pointer in the right direction. Thanks.


Here's the full contents of the form, after changing it to reflect the answer received.

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


change

<%= f.text_field :target %>

to

<%= f.text_field :target_id %>

And really better is to use something like select for this thing. Like:

<%= f.collection_select :target_id, Target.all, :id, :title %>

UPD

As far as date_select helper set not ordinary banch of variables for each element (year, month, day) you shoul do this:

date = [ params[:observation]['date(1i)'], params[:observation]['date(2i)'], params[:observation]['date(3i)'] ].join(".")
@observation = @target.observations.create(:date => date)

Actually just look into HTML source and you'll see it


(Not sure if you are still monitoring this, OP? For the benefit of everyone coming here via Google:)

There will be no params[:observation][:date] because dates are entered using several HTML input fields, and then magically merged in assignment. The keyword for this is "multi-parameter attributes", and this is the best explanation I've found:

How do ruby on rails multi parameter attributes *really* work (datetime_select)

I also wonder if this simpler snippet would work.

@observation = @target.observations.create(params[:observation])


You can use:

<%= collection_select(:observation, :target_id, Target.all, :id, :title %>

i think it will help you.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜