2015-11-17 2 views
1

У меня есть модель Ecto ниже. Когда я визуализую, я хочу, чтобы JSON заменил имя свойства «слои» для «tilemap_layers».Poison.Encoder как переименовать свойства в рендеринге JSON?

В моем приложении много типов «слоев», поэтому, когда я создал схему базы данных, мне нужно было создать однозначно названную схему. Однако этот JSON будет потребляться сторонним клиентом, где он должен быть назван «слоями».

Каков рекомендуемый способ?

Модель здесь:

defmodule MyProject.Tilemap do 
    use MyProject.Web, :model 

    @derive {Poison.Encoder, only: [ 
    :name, 
    :tile_width, 
    :tile_height, 
    :width, 
    :height, 
    :orientation, 
    :tilemap_layers, 
    :tilesets 
    ]} 

    schema "tilemaps" do 

    field :name, :string 
    field :tile_width, :integer 
    field :tile_height, :integer 
    field :width, :integer 
    field :height, :integer 
    field :orientation, :string 

    has_many :tilemap_layers, MyProject.TilemapLayer 
    has_many :tilesets, MyProject.Tileset 

    timestamps 
    end 

    @required_fields ~w(tile_width tile_height width height) 
    @optional_fields ~w() 

    @doc """ 
    Creates a changeset based on the `model` and `params`. 

    If no params are provided, an invalid changeset is returned 
    with no validation performed. 
    """ 
    def changeset(model, params \\ :empty) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    end 
end 

ответ

3

яд не дает путь к псевдониму при использовании @deriving

Вы можете:

указать об осуществлении себя defimpl (из the docs) :

defimpl Poison.Encoder, for: Person do 
    def encode(%{name: name, age: age}, _options) do 
    Poison.Encoder.BitString.encode("#{name} (#{age})") 
    end 
end 

Переименовать поле в схеме:

has_many :layers, MyProject.TilemapLayer

или использовать Phoenix Вид:

defmodule MyProject.TilemapView do 
    use MyProject.Web, :view 

    def render("index.json", %{tilemaps: timemaps}) do 
    render_many(tilemaps, __MODULE__, "tilemap.json") 
    end 

    def render("tilemap.json", %{tilemap: tilemap}) do 
    %{ 
     name: tilemap.name, 
     ... 
     layers: render_many(layers, MyProject.TilemapLayerView, "tilemap_layer.json") 
    } 
    end 
end 

Затем создайте TilemapLayerView:

+0

Еще раз спасибо Gazler! Я пытаюсь использовать параметр foreign_key, так как это то, что я действительно хочу –

+0

Woot! Это сработало! Мне нужно было изменить небольшую опечатку. Я изменил foreign_key:: tilemap_id –

+0

@JoshPetitt Вам, вероятно, не нужно указывать 'foreign_key' на самом деле. Не могли бы вы попробовать? – Gazler

Смежные вопросы