Phoenix - **(ArgumentError)无法识别的时间#<datetime(2021-12-31t23:59:00z)>

时间:2016-04-20 12:45:01

标签: elixir phoenix-framework

我正在使用Timex.DateTime通过我的项目处理日期时间&amp;到目前为止它完成了这项工作。

但是,我尝试为Phoenix.HTML.Form创建自定义构建器,以便在the documentation之后编辑日期时间publish_date

<div class="form-group">
<%= label f, :publish_date, class: "control-label" %>
<br />
<%= datetime_select f, :publish_date, class: "form-control", builder: fn b -> %>
Time: <%= b.(:hour, []) %> : <%= b.(:min, []) %> : <%= b.(:sec, []) %>
<br />
Date: <%= b.(:day, []) %> / <%= b.(:month, []) %> / <%= b.(:year, []) %>
<% end %>
<%= error_tag f, :publish_date %>

我从输出中了解到我使用不同类型,但我不知道如何改变它们,我还在学习凤凰,所以如果你有更好的方法来解决这个问题,那么它也很有用。

堆栈跟踪:

      Request: HEAD /news/12/edit
  ** (exit) an exception was raised:
      ** (ArgumentError) unrecognized time #<DateTime(2021-12-31T23:59:00Z)>
          (phoenix_html) lib/phoenix_html/form.ex:966: Phoenix.HTML.Form.time_value/1
          (phoenix_html) lib/phoenix_html/form.ex:895: Phoenix.HTML.Form.datetime_select/3
          (estrada) web/templates/news_article/form.html.eex:41: anonymous fn/2 in Estrada.NewsArticleView.form.html/1
          (phoenix_html) lib/phoenix_html/form.ex:235: Phoenix.HTML.Form.form_for/4
          (estrada) web/templates/news_article/form.html.eex:1: Estrada.NewsArticleView."form.html"/1
          (estrada) web/templates/news_article/edit.html.eex:3: Estrada.NewsArticleView."edit.html"/1
          (estrada) web/templates/layout/app.html.eex:48: Estrada.LayoutView."app.html"/1
          (phoenix) lib/phoenix/view.ex:344: Phoenix.View.render_to_iodata/3
          (phoenix) lib/phoenix/controller.ex:633: Phoenix.Controller.do_render/4
          (estrada) web/controllers/news_article_controller.ex:1: Estrada.NewsArticleController.action/2
          (estrada) web/controllers/news_article_controller.ex:1: Estrada.NewsArticleController.phoenix_controller_pipeline/2
          (estrada) lib/phoenix/router.ex:261: Estrada.Router.dispatch/2
          (estrada) web/router.ex:1: Estrada.Router.do_call/2
          (estrada) lib/estrada/endpoint.ex:1: Estrada.Endpoint.phoenix_pipeline/1
          (estrada) lib/plug/debugger.ex:93: Estrada.Endpoint."call (overridable 3)"/2
          (estrada) lib/phoenix/endpoint/render_errors.ex:34: Estrada.Endpoint.call/2
          (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
          (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

编辑:当我用它创建一个新帖子时这个表格效果很好,它只在我用它编辑帖子时崩溃,即当表单将数据提交给服务器时它会起作用,这个只有当我填充日期时间字段时才会发生。

1 个答案:

答案 0 :(得分:2)

问题是datetime_select仅支持limited number of formats of inputTimex.DateTime与其中任何一个都不匹配。

您可以手动将Timex.DateTime转换为支持的格式并传递:

替换

<%= datetime_select f, :publish_date, class: "form-control", builder: fn b -> %>

<%= datetime_select f, :publish_date, value: Timex.to_erlang_datetime(model.publish_date), class: "form-control", builder: fn b -> %>

(请记住将model替换为您的实际型号。)

当Elixir 1.3发布with a builtin DateTime struct时,希望在未来版本的phoenix_html和timex中不需要这种解决方法。