代码之家  ›  专栏  ›  技术社区  ›  user3755529

Rails向JSON序列化程序添加属性

  •  0
  • user3755529  · 技术社区  · 4 年前

    我有一个应该呈现为JSON的模型,为此我使用了一个序列化程序

    class UserSerializer
      def initialize(user)
        @user=user
      end
    
      def to_serialized_json
        options ={
          only: [:username, :id]
        }
    
        @user.to_json(options)
      end
    end
    

    当我 render json: 我想添加一个JWT令牌和一个 :errors

    def create
        @user = User.create(params.permit(:username, :password))
        @token = encode_token(user_id: @user.id) if @user     
        render json: UserSerializer.new(@user).to_serialized_json, token: @token, errors: @user.errors.messages
    end
    

    => "{\"id\":null,\"username\":\"\"}" token: errors:

    {\"id\":\"1\",\"username\":\"name\", \"token\":\"eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.7NrXg388OF4nBKLWgg2tdQHsr3HaIeZoXYPisTTk-48\", \"errors\":{}}
    

    我可以用

    render json: {username: @user.username, id: @user.id, token: @token, errors: @user.errors.messages}
    

    0 回复  |  直到 4 年前
        1
  •  1
  •   darkash    4 年前
    class UserSerializer
      def initialize(user)
        @user=user
      end
    
      def to_serialized_json(*additional_fields)
        options ={
          only: [:username, :id, *additional_fields]
        }
    
        @user.to_json(options)
      end
    end
    

    每次您想添加更多要序列化的字段时,可以执行以下操作 UserSerializer.new(@user).to_serialized_json(:token, :errors)

    如果留空,它将使用默认字段 :id, :username

    class UserSerializer
      def initialize(user)
        @user=user
      end
    
      def to_serialized_json(**additional_hash)
        options ={
          only: [:username, :id]
        }
    
        @user.as_json(options).merge(additional_hash)
      end
    end
    

    UserSerializer.new(@user).to_serialized_json(token: @token, errors: @user.error.messages)

    如果留空,它的行为仍将与您发布的原始类相同

        2
  •  1
  •   ogelacinyc    4 年前

    将\u json更改为as \u json,并合并新的键值。

    class UserSerializer
      def initialize(user, token)
        @user=user
        @token=token
      end
    
      def to_serialized_json
        options ={
          only: [:username, :id]
        }
    
        @user.as_json(options).merge(token: @token, error: @user.errors.messages)
      end
    end
    
        3
  •  1
  •   dedypuji    4 年前

    我更喜欢使用一些序列化gem来处理序列化过程,比如

    jsonapi序列化程序 https://github.com/jsonapi-serializer/jsonapi-serializer

    或其他

    推荐文章