2016-04-22 826 views
0

我使用的是凤凰在那里我有ISO8601格式START_TIME和END_TIME,我想验证END_TIME对JSON请求工作是> START_TIME,所以给出:验证ISO8601 START_TIME是在ISO8601 END_TIME之前仙丹/外生/天美

{ 
    "start_time": "2016-07-07T01:00:00+02:00", 
    "end_time": "2016-07-07T01:30:00+01:00" 
} 

验证错误应该返回两个字段,说“start_time”:“必须小于end_time”和“end_time”:“必须大于start_time”。

什么是使用ecto变更集(+ timex)来完成该操作的首选方法?

回答

1

您可以编写自定义函数vadlidate_time_range并在流水线内使用changeset函数。那些验证者需要以changeset结构作为第一个参数并返回changeset结构。

在这个函数里面你需要检查两个日期。如果他们改变了,他们将在changeset.changes。如果没有,你需要从模型中提取它们。你可以像这样得到它们:

start_time = changeset.changes |> Dict.get(:start_time, nil) 
start_time = start_time || (changeset.model |> Dict.get(:start_time)) 
{:ok, start_time} = Timex.parse start_time, "{ISO:Extended}" 

结束时间也是一样,所以你可能想要将这三个操作提取到一个函数中。

然后您需要与Timex.Comparable.compare(start_time, end_time)进行比较。

case comparison_result do 
    1 -> 
    changeset 
    _ -> 
    changeset 
    |> add_error(:start_time, "must be less then end_time") 
    |> add_error(:end_time, "must be greater than start_time") 
end 
+0

我已经结束了使用日历,但这是一个很好的指导方针。谢谢@tkowal – BurmajaM