可怕的冗余凤凰控制器

时间:2015-06-03 19:14:16

标签: elixir phoenix-framework ecto

我正在做我的第一个凤凰应用程序,并试图做新的/ 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,并且因为params在类型上有所不同,所以无论如何它都无法工作。

那么有人能给我一些神奇的方法来映射吗?

2 个答案:

答案 0 :(得分:5)

请根据您的型号信息查看Ecto变更集。他们将负责所有的解析,验证等等。

我的建议是使用mix phoenix.gen.htmlmix phoenix.gen.json中的一个来生成一些示例结构,以便您快速了解所有部分如何组合在一起:

mix phoenix.gen.html Chat chats fbid:integer latitude:float longitude:float content:string

请注意,如果您已经定义了Chat模型,则生成器将与您上面的代码冲突。

答案 1 :(得分:-1)

struct函数会将地图转换为结构:

iex(3)> defmodule User do         
...(3)> defstruct name: "john"    
...(3)> end

iex(4)> struct(User, %{name: "foo"})
%User{name: "foo"}