从多个表单元素

时间:2017-01-03 02:40:48

标签: elixir phoenix-framework ecto

这是我从元素创建自定义日期。我有一个表格收集一个人的出生日期和月份(我对这一年不感兴趣)。所以我使用以下内容,为这篇文章的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架构中没有monthregistration字段。我的问题是:

第1,由于我对出生年份不感兴趣,Ecto.Date仍然是适用于day_and_month_of_birth字段的类型吗?

2,如何解决错误?

1 个答案:

答案 0 :(得分:0)

基本上,您有两个整数范围1..121..31。但是对它们有很多限制/约束:230无效等等。这就是Ecto.Date类型在这里仍然适用的原因。要使用它,人们可能强迫年份始终为2000,并将此值来回传递到您的前端,使用隐藏字段“显示”它并传回。这样你就不会关心unrecognized date错误:从现在开始,你会得到%{"year" => 2000, "day" => "1", "month" => "1"}

另一方面,由于闰年的存在,只是日期和月份值是验证日期的不完整信息。在不知道年份的情况下,您无法证明February, 29是否是有效的出生日期。 2016/2/29有效,而2017/2/29则无效。从这个角度来看,退出滥用Ecto.Date并仅使用两个范围整数的范围字段听起来是合理的。