2016-04-11 3 views
0

Ich betreibe einen Code mit iex -S mix(UndefinedFunctionError) nicht definierte Funktion ändern/2 in Modell

Das ist ok:

user = Repo.get User, 1 

Ecto.Changeset.change user, %{name: "xxxx"} 

aber das ist falsch:

User.change user, %{name: "xxxx"} 

raise (UndefinedFunctionError) undefined function Rumbl.User.change/2

Ich merke, es gibt import Ecto.Changeset im Funktionsmodell in der Datei web.ex

def model do 
    quote do 
    use Ecto.Schema 

    import Ecto 
    import Ecto.Changeset 
    import Ecto.Query, only: [from: 1, from: 2] 
    end 
end 

So denke ich User.change/2 sollte die gleiche wie Ecto.Changeset.change/2, ist es richtig funktioniert?

+0

hat Ihr User-Modell Verwendung AnwName haben .Web,: Modell? –

+0

@SashaFonseca Ich habe, es ist Rumbl aus dem Buch "Programmierung Phoenix" –

+0

Bitte sehen Sie Ihre Antwort hier http://StackOverflow.com/Questions/22587524/Function-2-undefined-error-in-receive-block-elixir –

Antwort

3

Ich denke, dass Sie möglicherweise missverstehen, wie import funktioniert.

Von the docs:

Importiert Funktionen und Makros aus anderen Modulen.

Import ermöglicht einen einfachen Zugriff auf Funktionen oder Makros von anderen Modulen, ohne den qualifizierten Namen zu verwenden.

Was dies bedeutet, ist, dass Sie nicht Ecto.Changeset.change(user, %{} innerhalb des Moduls verwenden müssen, können Sie stattdessen change(user, %{}) tun.

Diese Änderung importiert nur die Funktionen in das verwendete Modul. Sie definiert sie nicht als Funktionen für das importierte Modell.

Wenn Sie in iex sind und wollen nicht den vollständig qualifizierten Funktionsnamen tippen, können Sie entweder tun:

alias Ecto.Changeset 
Changeset.change(user, %{}) 

oder:

import Ecto.Changeset 
change(user, %{}) 
+0

Danke, ich missverstehe' Import 'wirklich, es ist mit ruby's unterschiedlich. –

Verwandte Themen