2017-06-19 51 views
1

我使用鳳凰1.3.0-rc,我想打印一個url在我的json返回使用user_path(...)使用視圖渲染URL的conn

我的控制器:

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

回答

3

你必須通過conn直到觀點。請注意,Phoenix.Controller.render/3Phoenix.View.render/3不一樣。 「前者預計 連接並依賴於內容協商,而後者是連接不可知且通常從您的意見中調用的」 「。 在你的控制器:

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
+0

太棒了!它完美的工作!並感謝有關渲染之間差異的建議。最好! –

1

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

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