【发布时间】:2017-04-16 20:51:05
【问题描述】:
我的应用程序工作正常,api json 请求和常规 html。我的路由器.ex
defmodule MyApp.Router do
use MyApp.Web, :router
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
plug :put_secure_browser_headers
end
pipeline :api do
plug :accepts, ["json"]
end
scope "/api", MyApp do
pipe_through :api # Use the default browser stack
scope "/v1", V1, as: :v1 do
resources "/users", UserController, except: [:new, :edit, :index]
end
end
scope "/", MyApp do
pipe_through :browser # Use the default browser stack
get "/confirm/:token", UserController, :confirm, as: :user_confirm
end
end
我的网站/controllers/v1/user_controller.ex
defmodule MyApp.V1.UserController do
use MyApp.Web, :controller
def create(conn, %{"user" => user_params}) do
...
conn
|> put_status(:created)
|> put_resp_header("location", v1_user_path(conn, :show, user))
|> render("sign_up.json", user: Map.put(user, :session, result[:session]))
...
end
还有我的 web/controllers/user_controller.rb
defmodule MyApp.UserController do
use MyApp.Web, :controller
alias MyApp.User
def confirm(conn, %{"token" => token}) do
...
render(conn, "confirmed.html")
...
end
end
我的网站/views/v1/user_view.ex
defmodule MyApp.V1.UserView do
use MyApp.Web, :view
...
end
还有我的 web/views/user_view.ex
defmodule MyApp.UserView do
use MyApp.Web, :view
end
在我为 html 添加路由和控制器之前,一切正常。 现在,当我请求 api json 时,我得到一个错误
Request: POST /api/v1/users
** (exit) an exception was raised:
** (UndefinedFunctionError) function MyApp.V1.UserView.render/2 is undefined (module MyApp.V1.UserView is not available)
但是如果我删除 web/vews/user_view.ex,那么这个查询就可以正常工作。 你如何纠正这个错误?
【问题讨论】:
-
我有时会在出现编译问题并且我没有重新启动应用程序时看到这些错误。尝试双 crtl-c 出凤凰服务器。也尝试运行
mix clean,重启凤凰服务器。我能想到的唯一另一件事是别名问题。您可以暂时重命名其中一个 UserView 模块,看看是否有帮助。 -
@StevePallen 是的,例如在 UserViewHtml 中重命名 MyApp.UserView 可以解决问题。但我希望有另一种解决方案
-
也许编译/加载有问题。您也可以尝试将 Code.ensure_loaded/1 添加到您的 html 模块中。
-
看来 mix clean 真的很有帮助!奇怪的是第一次没有帮助,但现在我再次运行它,它可以工作。谢谢!
-
添加了一个答案,以便其他读者更快地访问。