Неопределенная функция conn / 0 в представлении - PullRequest
0 голосов
/ 28 мая 2019

Я работаю над книгой по программированию в Phoenix 1.4 и, создавая представление для пользователей, столкнулся с проблемой.Я постоянно получаю ошибку компиляции, говорящую

== Compilation error in file lib/rumbl_web/views/user_view.ex ==
** (CompileError) lib/rumbl_web/views/user_view.ex:3: undefined function conn/0
    (elixir) src/elixir_locals.erl:107: :elixir_locals."-ensure_no_undefined_local/3-lc$^0/1-0-"/2
    (elixir) src/elixir_locals.erl:107: anonymous fn/3 in :elixir_locals.ensure_no_undefined_local/3
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (elixir) lib/kernel/parallel_compiler.ex:208: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6`

при попытке скомпилировать и запустить проект.Вот рассматриваемое представление:

defmodule RumblWeb.UserView do
  use RumblWeb, :view
  alias Rumbl.Accounts

  def first_name(%Accounts.User{name: name}) do
    name
    |> String.split(" ")
    |> Enum.at(0)
  end

  def username(%Accounts.User{username: username}) do
    username
  end

end

Если я закомментирую строку use RumblWeb, :view, проект компилируется (хотя по понятным причинам не может отобразить представление).Я довольно плохо знаком с фениксом и эликсиром, так что это довольно сложно.

1 Ответ

0 голосов
/ 29 мая 2019

Если я добавлю conn в третью строку views/user_view.ex:

defmodule RumWeb.UserView do
  use RumWeb, :view
  conn  #====== *** HERE ***
  alias Rum.Accounts.User

  def first_name(%User{name: name} ) do
    name
    |> IO.inspect 
    |> String.split(" ")
    |> Enum.at(0)
  end


end

Я получаю почти ту же ошибку, что и вы:

$ mix phx.server
Compiling 9 files (.ex)
warning: variable "conn" does not exist and is being expanded to "conn()", please use parentheses to remove the ambiguity or change the variable name
  lib/rum_web/views/user_view.ex:3


== Compilation error in file lib/rum_web/views/user_view.ex ==
** (CompileError) lib/rum_web/views/user_view.ex:3: undefined function conn/0
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (elixir) lib/kernel/parallel_compiler.ex:198: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6

В середине моей ошибки нет следующего:

ensure_no_undefined_local/3-

но, возможно, это связано с различиями в версиях эликсира.

Если я поставлю conn где-нибудь в rumbl_web.ex, то ошибка указывает на rumbl_web.ex, а не user_view.ex. Вы публикуете все выходные после того, как вы делаете $ mix phx.server?

Вы уверены, что у вас нет двух открытых окон с двумя разными версиями файла user_view.ex? Я бы закрыл все окна вашего редактора, затем снова открыл ваш проект и снова посмотрел на user_view.ex.

Однажды у меня произошла странная ошибка, и решение было:

../rumbl$ rm -rf _build

затем сделайте:

../rumbl$ mix phx.server 

и mix перестроит ваш проект, воссоздав каталог _build в процессе.

...