在视图上使用conn来呈现url

时间:2017-06-19 21:00:00

标签: elixir phoenix-framework

我正在使用Phoenix 1.3.0-rc,我想使用user_path(...)在我的json回复中打印一个网址。

我的控制器:

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

我的观点:

...
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
...

我想写这个:

self: user_path(conn, :show, user.id)

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

2 个答案:

答案 0 :(得分:3)

你必须将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

您的观点:

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
  1. https://github.com/phoenixframework/phoenix/blob/master/lib/phoenix/controller.ex#L156

答案 1 :(得分:1)

您可以使用具有相同结果的Endpoint,例如:

alias MyAwesomeApp.Web.Endpoint
...
use_path(Endpoint, :show, user)