【问题标题】:Create Elixir Ecto data from multiple form elements从多个表单元素创建 Elixir Ecto 数据
【发布时间】:2017-01-03 13:48:52
【问题描述】:

这特别是我从元素中创建自定义日期。我有一个表格可以收集一个人的出生日期和月份(我对年份不感兴趣)。因此,我使用以下内容为本文所涉及的 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" =&gt; "1", "month" =&gt; "1"}

我想这是因为 registration 架构中没有 daymonth 字段。我的问题是:

第一,由于我对出生年份不感兴趣,Ecto.Date 仍然适合用于day_and_month_of_birth 字段吗?

2nd,我该如何解决这个错误?

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-02
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      相关资源
      最近更新 更多