2017-01-22 42 views
0

我試圖在靈藥登錄,但是當我把這個代碼:與登錄藥劑--Compilation錯誤定義多個clauses--

def changeset(model, params \\ :empty) do 
    model 
    |> cast(params, ~w(email), []) 
    |> validate_format(:email, ~r/@/) 
end 

我不斷收到此錯誤:

== Compilation error on file web/models/user.ex == 
** (CompileError) web/models/user.ex:25: definitions with multiple clauses and default values require a header. Instead of: 

def foo(:first_clause, b \\ :default) do ... end 
def foo(:second_clause, b) do ... end 

one should write: 

def foo(a, b \\ :default) 
def foo(:first_clause, b) do ... end 
def foo(:second_clause, b) do ... end 

def changeset/2 has multiple clauses and defines defaults in one or more clauses 
web/models/user.ex:25: (module) 
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6 
(elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1 

我知道我必須放一個標題,但我不知道如何解決它,任何人都可以解釋我嗎?

+2

您可以發佈該文件的休息嗎?看起來你正在定義'changeset/2'兩次。 – Dogbert

回答

2

您的代碼可能看起來是這樣的:

def changeset(model, params \\ :empty) do 
    # ... 
end 

def changeset(model, %{"some" => value}) do 
    # ... 
end 

藥劑抱怨這個,因爲具有默認值的多個條款,可能會導致歧義。爲了防止在語法級別出現這種情況,Elixir爲默認值強制使用單獨的函數頭。

由於錯誤信息提示,您需要添加一個單獨的函數頭定義默認值,然後再編寫其他條款沒有默認值:

# This is a function header, whose only purpose is to set 
# default values that apply to all subsequent clauses 
def changeset(model, params \\ :empty) 

def changeset(model, params) do 
    # ... 
end 

def changeset(model, %{"some" => value}) do 
    # ... 
end