我无法理解如何正确处理凤凰视图。 假设某个客户端正在调用“ login_user” api。 我的控制器将处理该请求,检查是否允许用户访问。作为响应,我需要将用户数据发送给呼叫者。 现在,在控制器的登录逻辑之后,正确的响应方式是什么?
1)提取调用者在控制器内部所需的所有数据:
user_data = function_that_fetch_user_data()
conn
|> put_resp_header("content-type", "application/json")
|> put_status(:ok)
|> send_resp(Status.code(:ok), user_data)
2)渲染视图
conn
|> put_resp_header("content-type", "application/json")
|> put_status(:ok)
|> render(login.json, user)
并获取其中的数据
defmodule CryptomonitorWeb.UserView do
use MyAppWeb, :view
def render("login.json", user) do
token = generate_user_token(user.mail)
%{
token: token,
email: user.mail,
group: "operators"
}
end
end
对我来说,获取数据并直接在控制器中建立我的响应更加清晰明了,但是我想知道处理api响应的“正确”方法是什么。我的应用通常只会将json返回给客户端,有时还会渲染一些html页面。
答案 0 :(得分:1)
视图表示要作为响应发送到的数据。因此,首先,您需要一些数据,其次,您必须以必须在某些API或HTML页面中呈现的方式来呈现它。
您绝对不想从视图进入数据库,但是如果您不去那里,则边框会更加微妙。
仍然,generate_user_token
看起来像数据发射器,而不像数据展示者。谁知道呢,也许有一天某人会更改功能,因此它将命中数据库以生成令牌。
为避免相关的麻烦,最好将数据生成器放在视图之外。将它们放入控制器,然后将结果发送到视图。
因此,我对选项1进行投票。