2017-01-22 1 views
0

Я пытаюсь сделать логин в эликсира, но когда я ставлю этот код:определения ошибок Войти Elixir --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

Можете ли вы опубликовать остальную часть этого файла? Похоже, вы дважды определяете «changeet/2». – Dogbert

ответ

2

Ваш код, вероятно, будет выглядеть примерно так:

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

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

Elixir жалуется на это, потому что наличие нескольких положений со значениями по умолчанию может привести к двусмысленности. Чтобы предотвратить такие ситуации на синтаксическом уровне, 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