2017-02-09 5 views
1

Я пытаюсь реализовать :create действие. Вот моя кодовая база.Elixir вставить запись дает неопределенный метод

defmodule Rumbl.Repo do 
    use Ecto.Repo, otp_app: :rumbl 
end 

для User.ex модели

defmodule Rumbl.User do 

    use Rumbl.Web, :model 

    schema "users" do 
     field :name, :string 
     field :username, :string 
     field :password, :string, virtual: true 
     field :password_hash, :string 

     timestamps() 
    end 

    def changeset(model, params \\ :empty) do 
     model 
     |> cast(params, ~w(name username), []) 
     |> validate_length(:username, min: 1, max: 20) 
    end 

end 

И мой контроллер:

defmodule Rumbl.UserController do 
    use Rumbl.Web, :controller 

    alias Rumbl.Repo 
    alias Rumbl.User 

    require Logger 

    def new(conn, _params) do 
     changeset = User.changeset(%User{}) 
     render conn, "new.html", changeset: changeset 
    end 

    def create(conn, %{"user" => _params}) do 
     changeset = User.changeset(%User{}, _params) 
     case Repo.insert changeset do 
      {:ok, user} -> 
       conn 
       |> put_flash(:info, "#{user.name} created!") 
       |> redirect to: user_path(conn, :index) 
      {:error, changeset} -> 
       render conn, "new.html", changeset: changeset 
     end 
    end 

    def index(conn, _params) do 
     users = Repo.all(User) 
     render conn, "index.html", users: users 
    end 

    def show(conn, %{"id" => id}) do 
     user = Repo.get(User, String.to_integer(id)) 
     render conn, "show.html", user: user 
    end 

end 

После того, как я запускаю мой феникс сервер он открывает новую страницу, и когда я отправить запрос, он дает мне ошибку :

функция Rumbl.Repo.insert/1 не определено или частных

Что я пропустил?

+0

Вы можете попробовать использовать 'Repo.insert (ревизии)' вместо 'Repo.insert changeset' (обратите внимание на дополнительные скобки). –

+0

@JustinWood Я сомневаюсь, что это важно, так как в сообщении об ошибке четко сказано, что он признал «Rumbl.Repo.insert/1' arity. – mudasobwa

+0

Я согласен, но из предоставленного кода я не вижу ничего, что не так. –

ответ

0

Я неправильно понял, подчеркиваю власть в Эликсире. На самом деле, чтобы устранить проблему, я должен написать

sef create(conn, %{"user" => user_params}) do 
     changeset = User.changeset(%User{}, user_params) 
     case Repo.insert changeset do 
      {:ok, user} -> 
       conn 
       |> put_flash(:info, "#{user.name} created!") 
       |> redirect to: user_path(conn, :index) 
      {:error, changeset} -> 
       render conn, "new.html", changeset: changeset 
     end 
    end