No function clause matching in Ecto.Date.to_string/1

I am trying to create blog with phoenix for learning purpose , but just follow the tutorial,here Building a Blog with Phoenix - Playing With Fire

but this blog is using the older version of deps, I am on the final step but facing error, anyone please give me some advice and how to fix it .

article_view.ex

defmodule Pxblog.ArticleView do
use Pxblog.Web, :view
use Timex

def list_date_format(date, format_string \ “%B %d, %Y”) do
<< Ecto.Date.to_iso8601(date) <> “T00:00:00Z” >>
|> DateFormat.parse!(“{ISOz}”)
|> DateFormat.format!(format_string, :strftime)
end
end

post_view.ex

defmodule Pxblog.PostView do
  use Pxblog.Web, :view
  use Timex
  def publish_status(true), do: "Published"
  def publish_status(_), do: "Draft"

  def date_format(date), do: date_format date, "%d %b %Y"

    def date_format(date = %Ecto.DateTime{}, format_string) do
      Ecto.DateTime.to_iso8601(date)
      |> date_formatter(format_string)
    end
    def date_format(date = %Ecto.Date{}, format_string) do
      << Ecto.Date.to_iso8601(date) <> "T00:00:00Z" >>
      |> date_formatter(format_string)
    end
    def date_format(_, _format), do: ""

    defp date_formatter(date, format_string) do
      date
      |> DateFormat.parse!("{ISOz}")
      |> DateFormat.format!(format_string, :strftime)
    end

end

mix.exs

defp deps do
[
{:phoenix, “~> 1.3.0-rc”},
{:phoenix_pubsub, “~> 1.0”},
{:phoenix_ecto, “~> 3.2”},
{:postgrex, “>= 0.0.0”},
{:phoenix_html, “~> 2.10”},
{:phoenix_live_reload, “~> 1.0”, only: :dev},
{:gettext, “~> 0.11”},
{:cowboy, “~> 1.0”},
{:earmark, “~> 0.1”},
{:timex, “~> 3.1”} # BUT in tutorial is using 0.19
]
end

My error

Are you on Ecto 2.1+?

You should update phoenix to 1.3.0, not the release candidate

Oh I see I am using Ecto V2.2

still the same error

I have the same error doing the same command… so it must be ~D[2017-09-01] not seen as a date.

iex> ~D[2017-09-01] |>  Ecto.Date.to_string
** (FunctionClauseError) no function clause matching in Ecto.Date.to_string/1    
    
    The following arguments were given to Ecto.Date.to_string/1:
    
        # 1
        ~D[2017-09-01]
    
    Attempted function clauses (showing 1 out of 1):
    
        def to_string(%Ecto.Date{year: year, month: month, day: day})
    
    (ecto) lib/ecto/date_time.ex:193: Ecto.Date.to_string/1

You cannot use a non-Ecto.Date with it in to_string without casting it first. So ~D[2017-09-01] |> Ecto.Date.cast() |> Ecto.Date.to_string().

Why are you using Ecto.Date anyway? In Ecto if you use the :date type it uses Elixir’s Date instead of Ecto’s date and it works just all around better.

1 Like

The blog post is old and use phoenix 1.1.4. Old post might not work with newer phoenix version.

BTW Ecto.Date is deprecated https://hexdocs.pm/ecto/Ecto.Date.html#content

2 Likes