表单提交后,Rails 3日期字段为空白

时间:2011-02-21 21:59:27

标签: ruby-on-rails ruby-on-rails-3 date scaffolding

Rails新手在这里。

我有2个模型:目标和观察

目标工作正常。我为观察生成了脚手架,如下所示:

rails generate scaffold Observation date:date target:references

所以app / models / observation.rb说:

class Observation < ActiveRecord::Base
  belongs_to :target
end

然后我编辑了app / models / target.rb:

class Target < ActiveRecord::Base
  has_many :observations
end

脚手架创建了app / views / observation / _form.html.erb,其中包括:

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

app / controllers / observation_controller.rb包括:

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

然后我去创建一个新的观察。我在目标字段中输入日期和目标的ID。当我提交时,我在浏览器中收到此错误:

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

似乎脚手架会设置一些可行的东西。但错误是有道理的。它正在接收Target的ID而不是Target本身。所以我编辑了app / controllers / observation_controller.rb来说:

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

现在它创建了Observation记录,并引用了Target。但是日期字段是空白的。

我意识到这可能是一个愚蠢的新手或RTFM问题,但我真的很感激指针朝着正确的方向发展。感谢。


这是表单的全部内容,在更改后反映收到的答案。

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

3 个答案:

答案 0 :(得分:1)

更改

<%= f.text_field :target %>

<%= f.text_field :target_id %>

更好的是使用select这样的东西。像:

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

<强> UPD

至于date_select助手为每个元素(年,月,日)设置的不是普通的变量,你应该这样做:

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

实际上只是查看HTML源代码,你会看到它

答案 1 :(得分:0)

(不确定你是否还在监视这个,OP?为了每个来到谷歌的人的利益:)

没有params[:observation][:date]因为使用多个HTML输入字段输入日期,然后在分配中神奇地合并。关键字是“多参数属性”,这是我发现的最佳解释:

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

我也想知道这个更简单的片段是否有用。

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

答案 2 :(得分:0)

您可以使用:

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

我认为它会对你有帮助。