我的凤凰代码缺少一些基本知识
这是在我的控制器中
def show(conn, %{"id" => id}) do
user = Repo.get!(User, id)
query =
from c in Card,
where: c.user_id == 1,
select: {c.id, c.inserted_at, c.estimate_name, c.product}
estimates = Repo.all(query)
render(conn, "show.json", %{user: user, estimates: estimates})
# render(conn, "show.json", user: user)
end
在我看来
# def render("show.json", %{user: user}) do
def render("show.json", %{user: user, estimates: estimates}) do
%{data: render_one(%{user: user, estimates: estimates}, Api.UserView, "user.json") }
# %{data: render_one(user, Api.UserView, "user.json")}
# ** New code since original post **
# %{data: render("user.json", %{user: user, estimates: estimates})}
end
def render("user.json", %{user: user, estimates: estimates}) do
# def render("user.json", %{user: user}) do
%{id: user.id,
firstname: user.firstname,
lastname: user.lastname,
email: user.email,
customerId: user.customerId,
estimates: render("estimates.json", estimates)} # **Line with last error**
end
def render("estimates.json", [head | _estimates]) do
# Enum.map(estimates, fn estimate -> render(mapper estimate, MosaicApi.UserView, "summaryEstimate.json") } end)
# render(mapper(head), MosaicApi.UserView, "summaryEstimate.json")
render("summaryEstimate.json", mapper(head))
end
# ** I'm fear I have added unnecessary complexity here **
def mapper({id, date, name, product}) do
%{id: id,
creation_date: date,
estimate_name: name,
product: product}
end
def render("summaryEstimate.json", estimate) do
%{id: estimate.id,
estimate_name: estimate.estimate_name,
product: estimate.product}
end
但是出现错误,这似乎是因为我的数据已从%{user: ..., estimates: [...]}
变为%{user: %{estimates:[...], user: %{...}}
。
那是怎么发生的,我该如何预防呢?
Could not render "user.json" for MosaicApi.UserView, please define a matching clause for render/2 or define a template at "web/templates/user". No templates were compiled for this module.
Assigns:
%{user: %{estimates: [{1, #Ecto.DateTime<2016-04-26T12:01:34Z>, "cards for annabelle", "Business Cards"}, ...], user: %Api.User{__meta__: #Ecto.Schema.Metadata<:loaded>, customerId: "CUST", email: "[email protected]", firstname: "fname 1", id: 1, inserted_at: #Ecto.DateTime<2016-04-26T11:46:21Z>, jobs: #Ecto.Association.NotLoaded<association :jobs is not loaded>, lastname: "lname 1", updated_at: #Ecto.DateTime<2016-04-26T11:46:21Z>}}, view_module: Api.UserView, view_template: "user.json"}
所述render_one / 4和render_many / 4的功能从视图活用的受让人的名称。我在Phoenix Framework中的“呈现多对多关系JSON”中对此进行了解释
因此,当您致电时会发生什么:
render_one(%{user: user, estimates: estimates}, Api.UserView, "user.json")
是否render
使用以下参数调用该函数:
render("user.json", %{user: %{user: %{...}, estimates: [...]})
您可以使用as
以下方法更改分配名称:
render_one(%{user: user, estimates: estimates}, Api.UserView, "user.json", as: :data)
它将使用以下命令调用render:
render("user.json", %{data: %{user: %{...}, estimates: [...]})
您可以将其与以下项匹配:
def render("user.json", %{data: %{user: user, estimates: estimates}}) do
您可以通过render
直接调用而不是使用来避免这种情况render_one
:
render("user.json", %{user: user, estimates: estimates})
另一种选择是使用将估计值嵌套在用户结构内部的数据结构。也许通过向您的架构添加虚拟属性。
编辑
def render("show.json", %{user: user, estimates: estimates}) do
%{data: render("user.json", %{user: user, estimates: estimates})}
end
def render("user.json", %{user: user, estimates: estimates}) do
%{id: user.id,
...
estimates: render_many(estimates, __MODULE__, "estimates.json", estimates. as: estimate)}
end
def render("estimates.json", %{estimate: {id, _date, name, product}}) do
%{id: id,
estimate_name: name,
product: product}
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句