2016-07-22 8 views
1

我可以做一个GET请求,但我似乎无法得到POST请求工作。不好的请求到Lxphnx.ArticleController.create,没有匹配的动作子句来处理请求

这是我的路线

article_path GET  /api/articles  Lxphnx.ArticleController :index 
article_path GET  /api/articles/:id Lxphnx.ArticleController :show 
article_path POST /api/articles  Lxphnx.ArticleController :create 
article_path PATCH /api/articles/:id Lxphnx.ArticleController :update 
       PUT  /api/articles/:id Lxphnx.ArticleController :update 
article_path DELETE /api/articles/:id Lxphnx.ArticleController :delete 

我还没有真正触及任何东西,除了使用混合phoenix.gen.json。这个项目只是一个API,所以我在创建项目时也使用了--no-brunch --no-html。

控制器:

defmodule Lxphnx.ArticleController do 
    use Lxphnx.Web, :controller 

    alias Lxphnx.Article 

    def index(conn, _params) do 
    articles = Repo.all(Article) 
    render(conn, "index.json", articles: articles) 
    end 

    def create(conn, %{"article" => article_params}) do 
    changeset = Article.changeset(%Article{}, article_params) 

    case Repo.insert(changeset) do 
     {:ok, article} -> 
     conn 
     |> put_status(:created) 
     |> put_resp_header("location", article_path(conn, :show, article)) 
     |> render("show.json", article: article) 
     {:error, changeset} -> 
     conn 
     |> put_status(:unprocessable_entity) 
     |> render(Lxphnx.ChangesetView, "error.json", changeset: changeset) 
    end 
    end 

    def show(conn, %{"id" => id}) do 
    article = Repo.get!(Article, id) 
    render(conn, "show.json", article: article) 
    end 

    def update(conn, %{"id" => id, "article" => article_params}) do 
    article = Repo.get!(Article, id) 
    changeset = Article.changeset(article, article_params) 

    case Repo.update(changeset) do 
     {:ok, article} -> 
     render(conn, "show.json", article: article) 
     {:error, changeset} -> 
     conn 
     |> put_status(:unprocessable_entity) 
     |> render(Lxphnx.ChangesetView, "error.json", changeset: changeset) 
    end 
    end 

    def delete(conn, %{"id" => id}) do 
    article = Repo.get!(Article, id) 

    # Here we use delete! (with a bang) because we expect 
    # it to always work (and if it does not, it will raise). 
    Repo.delete!(article) 

    send_resp(conn, :no_content, "") 
    end 
end 

路由器:

defmodule Lxphnx.Router做 使用Lxphnx.Web,:路由器

pipeline :api do 
    plug :accepts, ["json"] 
end 

scope "/api", Lxphnx do 
    pipe_through :api 
    resources "/articles", ArticleController, except: [:new, :edit] 
end 
end 

查看:

defmodule Lxphnx.ArticleView do 
    use Lxphnx.Web, :view 

    def render("index.json", %{articles: articles}) do 
    %{data: render_many(articles, Lxphnx.ArticleView, "article.json")} 
    end 

    def render("show.json", %{article: article}) do 
    %{data: render_one(article, Lxphnx.ArticleView, "article.json")} 
    end 

    def render("article.json", %{article: article}) do 
    %{id: article.id, 
     title: article.title, 
     body: article.body, 
     type: article.type} 
    end 
end 

哦,我也试过这个Phoenix.ActionClauseError at POST, no matching action clause to process request

我使用卷曲,我不忘记把它的应用程序/ JSON。这是我的卷发请求:curl -X POST -d '{"id":1, "title":"a title", "body":"a body", "type:1"}' -o log.txt localhost:4000/api/articles如果我使用邮差,我会得到相同的结果。

+0

您正在尝试模式匹配“文章”,但令人失望你没有设置你的有效载荷的文章;) –

+0

@JeremieGes对不起,但你能详细说明你的意思吗? –

回答

6

为了让你的函数子句,匹配,你需要在卷曲的要求,指定“文章”:

curl -X POST -d '{"article": {"id":1, "title":"a title", "body":"a body", "type:1"}}' -o log.txt localhost:4000/api/articles 

如果你不想在你的对象,这种变化顶级键:

def create(conn, %{"article" => article_params}) do 
    changeset = Article.changeset(%Article{}, article_params) 

到:

def create(conn, article_params) do 
    changeset = Article.changeset(%Article{}, article_params) 
+0

我正准备自己写答案。谢谢 :) –