用Phoenix框架如何 render json 数据?

用Rails的话可以这样从控制器发送json数据到前端:

def get_posts
  @posts = Post.where(user_id: params[:user_id].to_i)
  if request.xhr?
    render :json => {
      :posts => @posts
    }
  end
end

在前端这样接收处理:

$.ajax({
  type: "GET",
  url: "<%= get_post_path %>",
  data: {user_id: $("#user_id").val()},
  success: function(data, textStatus, xhr) {
    alert(data.posts);
    //...
  }

按照phoenix默认的CRUD方式生成的例子,这样:

mix phx.gen.json Accounts User users name:string age:integer
mix ecto.migrate Repo

在控制器中这样传数据:

def show(conn, %{"id" => id}) do
  user = Accounts.get_user!(id)
  render(conn, "show.json", user: user)
end

取json数据也OK:

curl http://localhost:4000/users/2
{"data":{"name":"a","id":2,"age":1}}

但是现在在一种特殊路由情况下,如:

post "/update_item", PostController, :update_item

控制器中这样:

def update_item(conn, %{"user_id" => user_id})
  # ...
  render conn, "update_item.json", user: user
end

不行,提示没有 update_item.json 这个文件,但实际上并不需要这样的文件, show.json 也不存在。
那么这种情况如何能向前端发送json数据呢?

阅读 3.8k
1 个回答

简单说就是你需要去写 PostView,加一个函数类似:

defmodule MyAppWeb.PostView do
  use HelloWeb, :view

  def render("update_item.json", %{user: user}) do
    # 这里返回你的 JSON
  end
end

详情参考官方文档:https://hexdocs.pm/phoenix/vi...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进