这是我从元素创建自定义日期。我有一个表格收集一个人的出生日期和月份(我对这一年不感兴趣)。所以我使用以下内容,为这篇文章的day_and_month_of_birth
元素创建表单条目:
<div class="form-group">
<div class="row">
<div class="col-md-5">Day / Month of Birth</div>
<%= date_select f, :day_and_month_of_birth, builder: fn b -> %>
<div class="col-md-3">
<%= b.(:day, []) %>
</div>
/
<div class="col-md-4">
<%= b.(:month, []) %>
</div>
<% end %>
<%= error_tag f, :day_and_month_of_birth %>
</div>
</div>
在我的模特中,我有:
defmodule RocfDev.Registration do
use RocfDev.Web, :model
schema "registration" do
field :title, :string, virtual: true
field :firstname, :string, virtual: true
field :surname, :string, virtual: true
field :day_and_month_of_birth, Ecto.Date, virtual: true
end
def changeset(model, params \\ %{}) do
model
|> cast(params, [
:title,
:firstname,
:surname,
:day_and_month_of_birth
])
end
目前,当我发布表单时,收到错误unrecognized date %{"day" => "1", "month" => "1"}
。
我想这是因为day
架构中没有month
和registration
字段。我的问题是:
第1,由于我对出生年份不感兴趣,Ecto.Date仍然是适用于day_and_month_of_birth
字段的类型吗?
2,如何解决错误?
答案 0 :(得分:0)
基本上,您有两个整数范围1..12
和1..31
。但是对它们有很多限制/约束:2
和30
无效等等。这就是Ecto.Date
类型在这里仍然适用的原因。要使用它,人们可能强迫年份始终为2000
,并将此值来回传递到您的前端,使用隐藏字段“显示”它并传回。这样你就不会关心unrecognized date
错误:从现在开始,你会得到%{"year" => 2000, "day" => "1", "month" => "1"}
。
另一方面,由于闰年的存在,只是日期和月份值是验证日期的不完整信息。在不知道年份的情况下,您无法证明February, 29
是否是有效的出生日期。 2016/2/29
有效,而2017/2/29
则无效。从这个角度来看,退出滥用Ecto.Date
并仅使用两个范围整数的范围字段听起来是合理的。