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.

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