鍍金池/ 問答/Java  網(wǎng)絡(luò)安全  HTML/ 用Phoenix框架如何 render json 數(shù)據(jù)?

用Phoenix框架如何 render json 數(shù)據(jù)?

用Rails的話可以這樣從控制器發(fā)送json數(shù)據(jù)到前端:

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默認(rèn)的CRUD方式生成的例子,這樣:

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

在控制器中這樣傳數(shù)據(jù):

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

取json數(shù)據(jù)也OK:

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

但是現(xiàn)在在一種特殊路由情況下,如:

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 也不存在。
那么這種情況如何能向前端發(fā)送json數(shù)據(jù)呢?

回答
編輯回答
我甘愿

簡單說就是你需要去寫 PostView,加一個函數(shù)類似:

defmodule MyAppWeb.PostView do
  use HelloWeb, :view

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

詳情參考官方文檔:https://hexdocs.pm/phoenix/vi...

2017年4月30日 04:02