可怕的冗余 Phoenix 控制器
Horribly redundant Phoenix controller
我正在做我的第一个 Phoenix 应用程序,并尝试做 new/2 控制器。
我写的代码是
def new(conn, %{"fbid" => fbid, "latitude" => lat, "longitude" => lng, "content" => content}) do
{fbid, _} = Integer.parse(fbid);
{lat, _} = Float.parse(lat);
{lng, _} = Float.parse(lng);
chats = %Chat{:fbid => fbid, :latitude => lat, :longitude => lng, :content => content}
|> Repo.insert
|> List.wrap
|> Poison.encode!
render conn, chats: chats
end
但它看起来非常多余,我找不到更好的方法来做到这一点。我读到无法将 Map 转换为 Struct,并且由于参数的类型不同,因此无论如何都行不通。
谁能告诉我一些神奇的映射方法?
struct 函数将映射转换为结构:
iex(3)> defmodule User do
...(3)> defstruct name: "john"
...(3)> end
iex(4)> struct(User, %{name: "foo"})
%User{name: "foo"}
请查看 Ecto 变更集,因为它们会根据您的模型信息进行转换。他们将负责所有的解析、验证等工作。
我的建议是使用 mix phoenix.gen.html
或 mix phoenix.gen.json
之一来生成一些示例结构,以便您快速了解所有部分如何组合在一起:
mix phoenix.gen.html Chat chats fbid:integer latitude:float longitude:float content:string
请注意,如果您已经定义了 Chat
模型,生成器将与您上面的代码冲突。
我正在做我的第一个 Phoenix 应用程序,并尝试做 new/2 控制器。 我写的代码是
def new(conn, %{"fbid" => fbid, "latitude" => lat, "longitude" => lng, "content" => content}) do
{fbid, _} = Integer.parse(fbid);
{lat, _} = Float.parse(lat);
{lng, _} = Float.parse(lng);
chats = %Chat{:fbid => fbid, :latitude => lat, :longitude => lng, :content => content}
|> Repo.insert
|> List.wrap
|> Poison.encode!
render conn, chats: chats
end
但它看起来非常多余,我找不到更好的方法来做到这一点。我读到无法将 Map 转换为 Struct,并且由于参数的类型不同,因此无论如何都行不通。
谁能告诉我一些神奇的映射方法?
struct 函数将映射转换为结构:
iex(3)> defmodule User do
...(3)> defstruct name: "john"
...(3)> end
iex(4)> struct(User, %{name: "foo"})
%User{name: "foo"}
请查看 Ecto 变更集,因为它们会根据您的模型信息进行转换。他们将负责所有的解析、验证等工作。
我的建议是使用 mix phoenix.gen.html
或 mix phoenix.gen.json
之一来生成一些示例结构,以便您快速了解所有部分如何组合在一起:
mix phoenix.gen.html Chat chats fbid:integer latitude:float longitude:float content:string
请注意,如果您已经定义了 Chat
模型,生成器将与您上面的代码冲突。