2017-01-03 62 views
0

这就是我特意从元素创建自定义日期。我有一张收集人的出生日期和月份的表格(我对这一年不感兴趣)。所以我用下面的,以创建day_and_month_of_birth元素的形式进入这个职位是:从多个表单元素创建Elixir Ecto数据

<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"}

我想这是因为在registration模式中没有daymonth字段。我的问题是:

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

2,如何解决错误?

回答

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并使用两个范围字段(都是整数类型)似乎是合理的。