coderVishal
coderVishal

Reputation: 9079

Undefined method cast after update to Ecto 2.0

I recently migrated to latest versions of phoenix and ecto.

Now I have changed code of a model, according to ecto changelog to

defmodule Spaces.Tag do
  use Spaces.Web, :model
#Changed to below
defmodule Spaces.Tag do
  use Ecto.Schema

I am getting (CompileError) web/models/tag.ex:23: undefined function cast/4. Anything I am missing?

My mix.exs relevant code

  defp deps do
    [{:phoenix, "~> 1.2"},
     {:postgrex, ">= 0.0.0"},
     {:phoenix_ecto, "~> 3.0"},
     {:phoenix_html, "~> 2.6"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.9"},
     {:cowboy, "~> 1.0"},
     {:httpoison, "~> 0.8.0"},
     {:jsx, "~> 2.8"},
     {:scrivener_ecto, "~> 1.0"},
     {:phoenix_html_simplified_helpers, "~> 0.4.0"},
     {:ex_doc, "~> 0.12.0", only: [:dev]}
    ]
  end

Upvotes: 3

Views: 1552

Answers (1)

Gazler
Gazler

Reputation: 84140

You also need to import certain modules:

  import Ecto
  import Ecto.Changeset # This is the one that includes cast
  import Ecto.Query

This was changed in Ecto 1.1 and was mentioned in http://www.phoenixframework.org/blog/upgrading-from-v10-to-v11#section-ecto-changes

You shouldn't need to do:

defmodule Spaces.Tag do
  use Spaces.Web, :model
#Changed to below
defmodule Spaces.Tag do
  use Ecto.Schema 

Instead you should update web.ex to:

defmodule Spaces.Web do
  def model do
    quote do
      use Ecto.Schema

      import Ecto
      import Ecto.Changeset
      import Ecto.Query
    end
  end
end

Upvotes: 8

Related Questions