【问题标题】:Rails 3 date field is blank after form submit提交表单后Rails 3日期字段为空
【发布时间】:2011-07-01 14:25:38
【问题描述】:

这里是 Rails 新手。

我有 2 个模型:Target 和 Observation

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

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/observations/_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)

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

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

现在它使用对目标的引用创建观察记录。但是日期字段是空白的。

我意识到这可能是一个愚蠢的新手或 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 %>

【问题讨论】:

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


    【解决方案1】:

    你可以使用:

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

    我认为它会帮助你。

    【讨论】:

      【解决方案2】:

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

      不会有params[:observation][:date],因为日期是使用多个 HTML 输入字段输入的,然后神奇地合并到赋值中。关键字是“多参数属性”,这是我找到的最好的解释:

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

      我也想知道这个更简单的 sn-p 是否可行。

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

      【讨论】:

        【解决方案3】:

        改变

        <%= f.text_field :target %>
        

        <%= f.text_field :target_id %>
        

        更好的是使用select 之类的东西。喜欢:

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

        UPD

        date_select helper 为每个元素(年、月、日)设置不同的变量组而言,您应该这样做:

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

        其实只要看看 HTML 源代码就知道了

        【讨论】:

        • 知道为什么当我以另一种方式尝试时它没有填充日期字段吗? :date => 参数[:observation][:date]
        • 其实我看到的一切都很好,所以一个错误不在现场,显示更多代码
        猜你喜欢
        • 2014-07-24
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        相关资源
        最近更新 更多