在视图上使用 conn 来渲染 url

Luc*_*nco 5 elixir phoenix-framework

我正在使用 Phoenix 1.3.0-rc,我想使用 .json 在我的 json 返回中打印 url user_path(...)

我的控制器:

...
def show(conn, %{"id" => id}) do
  user = User.find(id)
  render(conn, "show.json", user: user)
end
...
Run Code Online (Sandbox Code Playgroud)

我的看法:

...
def render("show.json", %{user: user}) do
  %{
    data: render_one(user, __MODULE__, "user.json"),
    links: render_one(user, __MODULE__, "links.json")
  }
end
...
def render("links.json", %{user: user}) do
  %{
    self: "/api/v1/users/#{user.id}"
  }
end
...
Run Code Online (Sandbox Code Playgroud)

我想这样写:

self: user_path(conn, :show, user.id)
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:undefined function conn/0

小智 6

您必须将 conn 传递到视图。请注意,Phoenix.Controller.render/3 与 不一样Phoenix.View.render/3。“前者期望连接并依赖于内容协商,而后者与连接无关并且通常从您的视图中调用”。1 在您的控制器中:

def show(conn, %{"id" => id}) do
  user = User.find(id)
  render(conn, "show.json", user: user, conn: conn)
end
Run Code Online (Sandbox Code Playgroud)

以及你的看法:

def render("show.json", %{user: user, conn: conn}) do
  %{
    data: render_one(user, __MODULE__, "user.json"),
    links: render_one(user, __MODULE__, "links.json", conn: conn)
  }
end
...
def render("links.json", %{user: user, conn: conn}) do
  %{
    self: user_path(conn, :show, user.id)
  }
end
Run Code Online (Sandbox Code Playgroud)
  1. https://github.com/phoenixframework/phoenix/blob/master/lib/phoenix/controller.ex#L156