Elixir phoenix - 관계를 사용하여 Ecto 스키마를 json으로 렌더링

7312 단어 elixir
Phoenix로 API를 작성하고 json을 클라이언트에 렌더링할 때,
  • 일부 필드의 경우 원래 값을 유지하고 싶습니다.
  • 일부 필드의 경우 반환하기 전에 일부 계산을 수행하거나 데이터 형식을 지정하고 싶습니다.
  • 그리고 Ecto 연관도 렌더링하고 싶습니다.

  • OnPoint에서 프로젝트 작업을 하는 동안 이 작업을 더 쉽게 수행하는 데 도움이 되는 작은 모듈을 빌드했습니다.

    해당 모듈을 추출하고 JsonView 라는 패키지로 릴리스했습니다. 소스 코드는 github에서 호스팅됩니다.

    https://github.com/bluzky/json_view

    Phoenix.View와 함께 사용하거나 독립적으로 사용할 수 있습니다. 데이터를 조작하고 렌더링 연결을 자동으로 처리하는 데 도움이 됩니다.

    작성하는 방법에 대한 기사를 게시했습니다.

    한 번 보자.

    먼저 보기 모듈 정의

      defmodule MyApp.UserView do
          use JsonView
          def render("user.json", %{user: user}) do
            render_json(user, [:first_name, :last_name, :vatar], [], [])
          end
      end
    
      defmodule MyApp.PostView do
          use JsonView
    
          # define which fields return without modifying
          @fields [:title, :content, :excerpt, :cover]
          # define which fields that need to format or calculate, you have to define `render_field/2` below
          @custom_fields [:like_count]
          # define which view used to render relationship
          @relationships [author: MyApp.UserView]
    
          def render("post.json", %{post: post}) do
              # 1st way if `use JsonView`
              render_json(post, @fields, @custom_fields, @relationships)
          end
    
          def render_field(:like_count, item) do
              # load like_count from some where
          end
      end
    


    그런 다음 사용하십시오.

    post = %Post{
        title: "Hello JsonView",
        excerpt: "Now you can render Json easier",
        content: "Install and put it to work",
        cover: nil,
        inserted_at: ~N[2021-07-05 00:00:00],
        updated_at: ~N[2021-07-09 00:00:00],
        author: %User{
            first_name: "Daniel",
            last_name: "James",
            email: "[email protected]",
            avatar: nil,
            inserted_at: ~N[2021-06-30 00:00:00]
            updated_at: ~N[2021-07-02 00:00:00]
        }
    }
    
    MyApp.PostView.render("post.json", %{post: post})
    
    # or invoke from PostController
    render(conn, "post.json", post: post)
    


    이것은 PhoenixController에서 반환하는 데 사용할 수 있는 결과입니다.

    %{
        title: "Hello JsonView",
        excerpt: "Now you can render Json easier",
        content: "Install and put it to work",
        cover: nil,
      like_count: nil,
        author: %{
            first_name: "Daniel",
            last_name: "James"
        }
    }
    


    의견이 있으시면 댓글 또는 create an issue .

    다음 포스트에서는 이 라이브러리를 작성하는 방법을 단계별로 살펴보겠습니다.

    좋은 웹페이지 즐겨찾기