表单中的date_select失败,"<field>无效"

Sha*_*mar 7 elixir ecto phoenix-framework

我有这个模板,

<div class="form-group">
  <label>Insurance Expiry : </label>
  <%= date_select f, :insurance_expiry, class: "form-control" %>
</div>
Run Code Online (Sandbox Code Playgroud)

和迁移有,

def change do
  create table(:buses) do

   # snipped

    add :insurance_expiry, :date, default: Ecto.Date.local

  end
Run Code Online (Sandbox Code Playgroud)

在db模型中,

 schema "buses" do

 # snipped

   field :insurance_expiry, :date

 end
Run Code Online (Sandbox Code Playgroud)

有关创建操作的调试信息,

[info] Processing by BusMan.BusController.create/2
  Parameters: %{"_csrf_token" => "PDkIZycHTRJsEzwOEBJRXxo6MVIFJgAAHla/FI4Y5PQxTYdk/XakNg==", "_utf8" => "?", "bus" => %{"bus_no" => "138", "chassis_no" => "nTHSNTH", "engine_no" => "RCHR989", "insurance_expiry" => %{"day" => "1", "month" => "10", "year" => "2019"}, "models" => "NTHRCG898", "reg_no" => "TN21W0613", "year_of_registration" => "1990"}, "format" => "html"}
Run Code Online (Sandbox Code Playgroud)

表单提交失败:

Oops, something went wrong! Please check the errors below:

    Insurance expiry is invalid
Run Code Online (Sandbox Code Playgroud)

我只想输入日期,是date_select我需要的还是我错过了其他的东西?

The*_*sor 8

正如JoséValim所纠正的那样,使用Ecto.Date而不是:date正确地解决问题,并且不需要明确的施法.


看起来传递给create函数的日期是一个地图.在插入之前,请尝试将其投射到日期

Ecto.Date.cast(%{"day" => "1", "month" => "10", "year" => "2019"})

我可以想象看起来像的代码

selected_date = %{"day" => "1", "month" => "10", "year" => "2019"}
  |> Ecto.Date.cast
  |> Repo.insert!
Run Code Online (Sandbox Code Playgroud)