SDKリファレンス - Workatoスキーマ

このページは機械翻訳により提供されています。翻訳内容と英語版に相違がある場合は、英語版が優先されます。

次のセクションでは、Workatoで入力フィールドと出力フィールドを定義する方法を説明します。これらをまとめて"Schema"と呼びます。 この情報は、入力フィールドまたは出力フィールド(データピル)を定義するコネクターコード内の任意の場所に適用できます。 これは、connectionactionstriggersobject_definitionsなどの場所です

クイック概要

Workatoスキーマを理解することは、ユーザーフレンドリーで直感的なコネクターを構築するために不可欠です。 コネクターにさまざまな属性を付与して、使いやすくできます。 このスキーマはハッシュの単純な配列で、配列内の各インデックスが1つの入力フィールドまたは出力フィールドを表します。

これらの定義は入力フィールドと出力フィールドの両方で完全に互換性があるため、スキーマを一度記述して再利用しやすくなります。

構造

ruby
  [
    {
      name: String,
      label: String,
      optional: Boolean,
      type: String,
      hint: String,
      of: String,
      properties: Array,
      control_type: String,
      toggle_hint: String,
      toggle_field: Hash,
      default: String,
      pick_list: String,
      delimiter: String,
      sticky: Boolean,
      convert_input: String,
      convert_output: String,
      change_on_blur: Boolean,
      support_pills: Boolean,
      custom: Boolean,
      extends_schema: Boolean,
      list_mode: String,
      list_mode_toggle: Boolean,
      item_label: String,
      add_field_label: String,
      empty_schema_message: String,
      sample_data_type: String,
      ngIf: String
    },
    {
      # Another field definition
    }
  ]

属性の説明

キー定義
name必須。 このフィールドの名前。 例: idまたはcreated_at
optional任意です。 デフォルトはfalseです。 入力フィールドに適用され、レシピを実行する前にユーザーがこのフィールドに入力するようにします。
label任意です。 すべてのフィールドには、フィールド名に基づくデフォルトのラベルがあります。 これを使用して、フィールドラベルのデフォルト値を変更します。
hint任意です。 これにより、入力フィールドの下にヒントを追加してユーザーをガイドできます。 ドキュメントへのリンクはHTML構文を使用して指定できます。
type任意です。 このフィールドのデータ型。 デフォルト値は"string"です。 使用可能な値:
- "string"
- "integer"
- "number"
- "date_time"
- "date"
- "timestamp"
- "boolean"
- "object" - propertiesを伴う必要があります
- "array" - ofを伴う必要があります
oftype: "array"の場合を除き任意です。 配列と組み合わせて使用し、配列のデータ型を定義します。 使用可能な値:
- "string"
- "integer"
- "number"
- "date_time"
- "date"
- "timestamp"
- "boolean"
- "object" - オブジェクトの配列を示します。 properties属性を伴う必要があります。
propertiestype: "object"の場合、またはtype: "array"かつof: "object"の場合を除き任意です。 オブジェクトのプロパティを示すスキーマの配列を受け入れます。
control_type任意です。 このフィールドは入力フィールドにのみ関連し、レシピで公開する入力フィールドのタイプを指定します。 デフォルトは"string"です。 このスキーマが出力フィールドとして使用される場合、この属性は無視されます。
サポートされているコントロールタイプのリストを参照してください。
toggle_hint任意です。 これはプライマリトグルのラベルを表します。 詳細については、トグルフィールドを参照してください。
toggle_field任意です。 この入力フィールドのセカンダリトグルを表すハッシュ。 詳細については、トグルフィールドを参照してください。
default任意です。 その入力フィールドのデフォルト値を設定できます。
pick_list任意です。 control_typeが:selectまたは:multiselectの場合、このプロパティは必須です。 pick_listsキーで定義されたピックリストを参照するか、直接定義できます。 ピックリストを直接定義する場合は、Picklistsで説明されているものと同じ2D配列を指定します
optionspick_listと同義で、connection入力フィールドにのみ使用されます。
delimiter:control_type: "multiselect"でない限り任意です。 この区切り文字は、ユーザーが提供する各入力の間に使用されます。
sticky任意です。 このプロパティを使用して、このフィールドを入力フィールドとして常に表示します。 デフォルトでは、任意の入力は任意フィールドのドロップダウン内に非表示になります。 sticky: trueを使用すると、必須フィールドの横に表示されます。
convert_input任意です。 入力フィールドを定義する場合、これらのフィールドに渡される値は、定義されたtypeに関係なく文字列と見なされます。 convert_inputを使用すると、これらの入力がexecuteブロックのinput引数に渡される前に、変換および加工できます。 詳細
convert_output任意です。 出力フィールドを定義する場合、各フィールドのnameexecute lambda関数の実際の出力内のキーと照合されます。 ただし、これにより、出力のvalueが一致したフィールドに対して宣言されたtypeと一致することは保証されません。 convert_outputを使用すると、これらの入力を変換および加工できるほか、特定の出力フィールドに割り当てられた受信値を正しく"cast"できます。 詳細
change_on_blur任意です。 trueの場合、configフィールドと依存フィールドは、キー入力ごとではなく、ユーザーがフィールドからフォーカスを外したときにのみ値を評価します。 このパラメーターは多くの場合、設定する必要はありません。
support_pills任意です。 デフォルト値はtrueです。 falseの場合、このフィールドにはデータピルをマッピングできません。 このパラメーターは多くの場合、設定する必要はありません。
custom任意です。 trueの場合、このフィールドがカスタムであることをユーザーに示す特別なマーカーが導入されます。 通常、カスタムフィールドを含む可能性があるオブジェクト定義を動的に生成する場合に使用されます。
extends_schema任意です。 フィールドをconfig_fieldのように動作させることができます
list_mode任意です。 type: "array"かつof: "object"の場合に使用されます。 Workatoのデフォルトは動的リストですが、このパラメーターを使用すると、この入力フィールドを静的配列入力フィールドに設定できます。 使用可能な値:
- "static" - ユーザーはこの配列内の各インデックスを定義する必要があります。
- "dynamic" - ユーザーはリストデータピルを使用して、この配列内の各インデックスを動的に定義できます。
list_mode_toggle任意です。 type: "array"かつof: "object"の場合に使用されます。 ユーザーが配列を操作するときに、静的リストと動的リストを切り替えることができます。 デフォルトはtrueです。 ユーザーがリストモードを切り替えられないようにするには、list_mode_toggle: falseを設定します。
item_label任意です。 control_type: "schema-designer"またはcontrol_type: "key_value"でのみ使用されます。 これにより、モーダルポップアップに表示される項目名を設定できます。 item_label: "Item Label"を設定すると、次のようになります:
add_field_label任意です。 control_type: "schema-designer"またはcontrol_type: "key_value"でのみ使用されます。 これにより、追加ボタンのラベルを設定できます。 add_field_label: "Custom Add Label"を設定すると、次のようになります:
empty_schema_message任意です。 control_type: "schema-designer"またはcontrol_type: "key_value"でのみ使用されます。 これにより、入力フィールドが空の場合のメッセージを設定できます。 empty_schema_message: Custom empty schema message that allows you to add field and generate schemaを設定すると、次のようになります:
sample_data_type任意です。 control_type: "schema-designer"でのみ使用されます。 これにより、schema-designer入力フィールドが受け入れるデータのタイプを設定できます。 sample_data_type: csvを設定すると、次のようになります: その他の使用可能な入力はjson_inputとxmlです。 schema-designerのデフォルトはjson_inputです。
ngIf任意です。 booleanステートメントを定義できます。 trueの場合、このフィールドが表示されます。 booleanステートメントは、同じスキーマ内の他の入力を参照できます。 たとえば、ngIf: 'input.object_name != "approval"'では、ルートノードはinputであり、ドット表記を使用して特定のフィールドに移動できます。 詳細については、ngIfを使用してフィールドを条件付きで非表示または表示するを参照してください。
tree_options任意です。 control_type: 'tree'の場合にのみ使用されます。 これにより、treeピックリストの動作を制御できます。 このキーには、selectable_foldermulti_selectforce_selection_hierarchyの3つの使用可能なキーを持つHashが必要です。 詳細については、Picklistsを参照してください。

コントロールタイプ

control_typeキーは、ユーザーが定義した入力フィールドを設定する方法に影響します。 各入力フィールド(スキーマ配列内のインデックス)について、control_type属性にいずれかの値を割り当てることで外観を制御できます。

コントロールタイプ説明
テキスト Formulaモードオプション付きのシンプルなテキスト入力フィールド。
text control type
text-area Formulaモードオプション付きの長いテキスト入力フィールド。
text-area control type
plain-text Formulaモードオプションなしのシンプルなテキスト入力フィールド。
plain-text control type
plain-text-area Formulaモードオプション付きの長いテキスト入力フィールド。 この入力フィールドは、調整アイコンを使用して展開できます。
plain-text-area control type
password パスワードなどの機密情報用に特別に設計されたテキスト入力フィールド。 このコントロールタイプのテキスト入力はマスクされます。
password control type
integer integer値を示すアイコン付きのシンプルな数値フィールド。 このコントロールタイプにはFormulaモードオプションがあります。
integer control type
number float値を示すアイコン付きの小数値フィールド。 このコントロールタイプにはFormulaモードオプションがあります。
number control type
url URL値を示すアイコン付きのテキストフィールド。 このコントロールタイプにはFormulaモードオプションがあります。
url control type
select 選択する定義済み値のリストを提供するコントロールタイプ。 pick_listプロパティを必ず含めてください。
select control type
checkbox シンプルなYes/No選択インターフェース。 動的マッピングとFormulaモードオプションのために、トグルフィールドを追加することをお勧めします。
checkbox control type
multiselectselectに似ていますが、複数の値を選択する機能が追加されたコントロールタイプ。 このコントロールタイプには、pick_listプロパティとdelimiterプロパティを伴う必要があります。
multiselect control type
date date値を示すコントロールタイプ。 このコントロールタイプにはFormulaモードオプションがあります。 date control type
date_time 時刻付きdate値を示すコントロールタイプ。 このコントロールタイプにはFormulaモードオプションがあります。 date_time control type
phone phone値を示すコントロールタイプ。 このコントロールタイプにはFormulaモードオプションがあります。
phone control type
email email値を示すコントロールタイプ。 このコントロールタイプにはFormulaモードオプションがあります。
email control type
subdomain 特定のサイトのサブドメインを示すコントロールタイプ。 通常、コネクションフィールドで使用されます。 urlプロパティを必ず含めてください。
subdomain control type
schema-designer ユーザーからスキーマ情報を収集できるコントロールタイプ。 レシピ設計時に、入力フィールドまたは出力フィールドを作成するためにユーザーに入力を提供してもらう必要がある場合に便利です。 有効にするにはextends_schema: trueが必要です。
{
  name: "schema",
  extends_schema: true,
  schema_neutral: false,
  control_type: 'schema-designer',
  label: 'Schema designer label',
  hint: 'Hint for schema designer field',
  item_label: 'button',
  add_field_label: 'Custom Add Label',
  empty_schema_message: 'Custom empty schema message that allows to <button type="button" data-action="addField">add field</button> and <button type="button" data-action="generateSchema">generate schema</button>',
  sample_data_type: 'csv' # json_input / xml
},
schema-designer
key_value ユーザーからキーと値のペアを収集できるコントロールタイプ。 レシピ設計時に、URLクエリパラメーター用にユーザーに入力を提供してもらう必要がある場合に便利です。 `properties`を定義し、2つの入力を指定する必要があります。
{
  name: "key_value",
  control_type: "key_value",
  label: "key_value",
  empty_list_title: "Add query parameters",
  empty_list_text: "Description for empty list",
  item_label: "Query parameter",
  type: "array",
  of: "object",
  properties: [
    { name: "key"},
    { name: "value"}
  ]
},
        
key_value

ネストされたオブジェクト

多くの場合、APIリクエストから返されるデータは単純な1階層のJSONではありません。 多くの場合、返されるJSONオブジェクトははるかに複雑で、複数レベルのネストがあります。 このセクションでは、ネストされたフィールドの定義方法を説明します。

サンプルコードスニペット

json
{
  "id": "00ub0oNGTSWTBKOLGLNR",
  "status": "STAGED",
  "created": "2013-07-02T21:36:25.344Z",
  "activated": null,
  "lastLogin": "2013-07-02T21:36:25.344Z",
  "profile": {
    "firstName": "Isaac",
    "lastName": "Brock",
    "email": "[email protected]",
    "login": "[email protected]",
    "mobilePhone": "555-415-1337"
  },
  "credentials": {
    "provider": {
      "type": "OKTA",
      "name": "OKTA"
    }
  },
  "_links": {
    "activate": {
      "href": "https://your-domain.okta.com/api/v1/users/00ub0oNGTSWTBKOLGLNR/lifecycle/activate"
    }
  }
}

ネストされたオブジェクトフィールドprofileは、propertiesを使用して内部にフィールドをネストし、type: :objectとして定義できます。 Propertiesはフィールドオブジェクトの配列(userオブジェクト内のfieldsと同様)である必要があります。

ruby
object_definitions: {
  user: {
    fields: lambda do
      [
        {
          name: "id"
        },
        {
          name: "status"
        },
        {
          name: "created",
          type: :timestamp
        },
        {
          name: "activated",
          type: :timestamp
        },
        {
          name: "lastLogin",
          type: :timestamp
        },
        {
          name: "profile",
          type: :object,
          properties: [
            {
              name: "firstName"
            },
            {
              name: "lastName"
            },
            {
              name: "email",
              control_type: :email
            },
            {
              name: "login",
              control_type: :email
            },
            {
              name: "mobilePhone",
              control_type: :phone
            }
          ]
        }
      ]
    end
  }
}

ネストされた配列

ネストされたフィールドのもう1つの一般的なタイプは、オブジェクトの配列です。 このタイプのフィールドには、同じフィールドを持つ繰り返しオブジェクトのリストが含まれます。 このようなフィールドの定義は、オブジェクトの定義に似ています。 Asanaの次のサンプルuserオブジェクトを例にします。

サンプルコードスニペット

json
{
  "data": {
    "id": 12149914544379,
    "email": "[email protected]",
    "name": "Ee Shan",
    "workspaces": [
      {
        "id": 1041269201604,
        "name": "Workato"
      },
      {
        "id": 498346130780,
        "name": "Product Documentation"
      }
    ]
  }
}

workspaces配列には、type: :arrayof: :objectを指定する必要があります。 これにより、object_definitionsフレームワークに、このフィールドにオブジェクトの配列が含まれることを伝えます。 ネストされたオブジェクトと同様に、propertiesを定義する必要があります。これは、workspaces配列内の各オブジェクトのフィールドに対応するフィールドの配列です。

ruby
object_definitions: {
  user: {
    fields: lambda do
      [
        {
          name: 'id',
          type: :integer
        },
        { name: 'name' },
        {
          name: 'email',
          control_type: :phone
        },
        {
          name: 'workspaces',
          type: :array,
          of: :object,
          properties: [
            {
              name: 'id',
              label: 'Workspace ID',
              type: :integer
            },
            { name: 'name' }
          ]
        }
      ]
    end
  }
}

トグルフィールドの使用

トグルフィールドは、2つの入力タイプを使用できる特殊な入力フィールドです。 入力フィールドに柔軟性を高め、使いやすさを向上させる優れた方法です。 使用すると、トグルフィールドによりユーザーは2つのコントロールタイプを切り替えられます。

TIP

トグルフィールドは、多くの場合ピックリストと組み合わせて使用されます。 ピックリストはドロップダウンを生成するため、ユーザーは通常レシピで行うようにデータピルをマッピングできません。 トグルフィールドは、データピルを受け入れられるプレーンテキストフィールドに切り替えられるようにすることで、この問題を解決します。

サンプルコードスニペット

ruby
    input_fields: lambda do |object_definition, connection, config_fields|
      {
        name: "parser_id",
        label: "Document Parser",
        hint: "The Document Parser the file gets imported to",
        control_type: :select,
        pick_list: "parsers",
        optional: false,
        toggle_hint: "Select from list",
        toggle_field: {
          name: "parser_id",
          label: "Parser ID",
          type: :string,
          control_type: "text",
          optional: false,
          toggle_hint: "Use Parser ID",
          hint: "Go to home page and select the required parser. If the URL is 'https://app.docparser.com/stack/ynrqkdxvaghs/overview', then 'ynrqkdxvaghs' is the ID"
        }
      },
    end

プライマリトグルプライマリトグルフィールド

セカンダリトグルセカンダリトグルフィールド

ピックリスト入力タイプを使用して、カスタマイズされたユーザーエクスペリエンスを作成できます。 ただし、これによりアクション値のマッピングが静的になります。 ピックリストから選択できる値は1つだけであるため、このアクションを実行するすべてのレシピジョブは、選択した単一のパーサーID値を使用します。 テキストフィールドを使用すると、この制限を回避できます。 テキストフィールドを使用すると、入力フィールド値を動的にマッピングできます。

計画しているユースケースで両方のフィールドタイプが望ましい場合は、toggle_fieldを使用して両方の入力オプションをユーザーに提供できます。 最も一般的なシナリオは、ユーザーがアクションごとに1つのパーサーを選択することなので、ピックリストタイプはプライマリトグルとして設定され、テキストフィールドはセカンダリ(ネストされたtoggle_field)として設定されます。

extends_schemaを使用したフィールドの使用

場合によっては、アクションで表示する予定の入力フィールドが、同じアクション内の入力フィールドへの回答に依存します。 extends_schema機能を使用すると、設定フィールドを使用せずにアクションに動的な動作を追加できます。

サンプルコードスニペット

ruby
object_definitions:
  schema_input: {
    fields: lambda do |connection, config_fields, object_definitions|
      input_schema = parse_json(config_fields.dig('schema') || '[]')
      [
        {
          name: "schema",
          extends_schema: true,
          schema_neutral: false,
          control_type: 'schema-designer',
          label: 'Schema designer label',
          hint: 'Hint for schema designer field',
          item_label: 'button',
          add_field_label: 'Custom Add Label',
          empty_schema_message: 'Custom empty schema message that allows you to <button type="button" data-action="addField">add field</button> and <button type="button" data-action="generateSchema">generate schema</button>',
          sample_data_type: 'csv' # json_input / xml
        },
        if input_schema.present?
          { name: 'data', type: 'object', properties: input_schema }
        end
      ].compact
    end
  }

前述のコードサンプルは、control_typeschema-designerに設定した入力フィールドの使用方法を示しています。 extends_schematrueに設定すると、ユーザー入力によってobject_definitionsブロックの再評価がトリガーされます。 入力は、さらに処理するためのconfig_fieldsになります。 この設定により、schemaフィールドへの入力がdata入力フィールドの作成に直接影響します。

schema_neutralパラメーターを使用すると、スキーマのロジックを変更せずにタイトルまたは説明を更新できます。 これにより、変更がタイトルまたは説明に影響し、スキーマ自体には影響しない場合に、柔軟性と制御が向上します。 schema_neutralを使用すると、入力が空の場合でも拡張スキーマの結果を返すことができます。

プリミティブスカラー データ型の配列

Workatoの入力および出力スキーマの配列は、現在オブジェクトでのみ機能します。 文字列や整数などのプリミティブデータ型の配列を収集する必要がある場合は、以下のコードを検討してください。 この例では、文字列の配列を["column1","column2","column3"]の形式でターゲットAPIに送信する予定です。 これは、column names入力フィールドの宣言をオブジェクトレイヤー内にラップして、オブジェクトの配列を宣言することで実行できます。

サンプルコードスニペット

ruby
object_definitions: {
  columns: {
    fields: lambda do
      [
        {
          label: 'String Array',
          name: 'array_of_strings',
          type: "array",
          of: "string"
        }
      ]
    end
  }
}

ngIfを使用してフィールドを条件付きで非表示または表示する

場合によっては、ユーザーの入力に基づいてフィールドを非表示または表示する必要があります。 これは、input_fieldsキーまたはconfig_fieldsキーに含めることができます。 たとえば、別のconfig_fieldへのユーザー入力に基づいて追加のconfig_fieldを表示したい場合です。 別のユースケースとして、別の入力フィールドに対するユーザーの入力に基づいて新しい入力フィールドを表示する場合があります。 たとえば、ユーザーを作成するアクションがあり、1つの入力フィールドがassign_new_passwordの場合、その入力に対してユーザーがtrueを指定したときにnew_passwordを条件付きで表示するためにngIfを使用します。

サンプルコードスニペット

ruby
object_definitions: {
  create_user: {
    fields: lambda do |_connection, config_fields|
      [
        {
          name: 'assign_new_password',
          label: 'Assign new password during creation',
          hint: "Select <b>yes</b> to provide a password for this newly created user. If set to <b>no</b>, an email is sent to user to define their own password.",
          control_type: 'checkbox',
          type: 'boolean',
          sticky: true,
        },
        {
          name: 'password_input',
          label: 'Custom password',
          control_type: 'password',
          ngIf: 'input.assign_new_password == "false"',
          sticky: true,
          hint: 'Required if <b>Assign new password during creation</b> is set to <b>yes</b>. ' \
                  'Provide a password of length 8 to 100 characters.'
        },
      ]
    end
  }
}

簡単な変換のためのconvert_inputconvert_outputの使用

ほとんどの場合、ユーザーがフィールドをアクションの入力フィールドにマッピングすると、入力フィールドに設定した実際のtypeまたはcontrol_typeに関係なく、これらの値はデータ型stringと見なされます。

たとえば、以下のスキーマです。

[
  {
    name: "account_id",
    control_type: "integer"
    type: "int"
  }
]

inputexecute lambdaに渡されると、JSONオブジェクト内では引き続き次のように渡されます

{
  "account_id": "123"
}

このような場合、execute lambdaに渡される前に、convert_inputを使用して入力を期待されるデータ型に変換できます。

例:

[
  {
    name: "account_id",
    control_type: "integer"
    type: "int",
    convert_input: "integer_conversion"
  }
]

convert_inputを定義すると、execute lambdaに渡されるinput引数は次のようになります。

{
  "account_id": 123
}

これにより、スキーマを定義するときに期待されるデータ形式を設定でき、データが正しい形式であることを保証するためのexecute内の不要なコードを省略できます。 convert_outputを使用する場合も逆方向で同じ動作が見られます。execute lambdaの出力からの値が、convert_output属性を含む出力フィールドにマッピングされるときに変換されます。

定義済みconvert_input

  • integer_conversion

  • 入力をintegerデータ型に変換します

  • float_conversion

  • 入力をfloatデータ型に変換します

  • date_conversion

  • 入力をdateデータ型に変換します

  • render_iso8601_timestamp

  • 入力をISO8601標準に準拠した日付文字列に変換します

  • boolean_conversion

  • 入力をbooleanデータ型に変換します

定義済みconvert_output

  • integer_conversion

  • 出力をinteger/numberデータ型に変換します

  • float_conversion

  • 出力をfloatデータ型に変換します

  • date_conversion

  • 出力をdateデータ型に変換します

  • date_time_conversion

  • 出力をJavaScriptのDateオブジェクトのtoJSONメソッドと一致する形式に変換します

  • boolean_conversion

  • 出力をbooleanデータ型に変換します

TIP

上記の変換ではニーズに合わない場合があります。 たとえば、特定の時刻形式への変換が必要な場合や、データの構造を操作したい場合です。 このような場合、独自のカスタムconvert_input関数とconvert_output関数を作成できます。 これを行う方法については、続けてお読みください。

convert_inputconvert_outputでメソッドを使用した高度な変換

状況によっては、APIが特定の形式でデータを送信することを要求します。 たとえば、APIが日付時刻をepoch時刻で要求する場合があります。 多くの場合、レシピエディターのユーザーがepoch時刻に慣れていることや、データのマッピング元である上流システムが日付時刻をepoch形式で提供することを想定できません。 このような場合、convert_inputと組み合わせてメソッドを使用し、入力を適切な形式にキャストします。

例:

ruby
[
  {
    name: 'invoice_date',
    control_type: "date_time",
    convert_input: "epoch_time_conversion"
  }
]

およびepoch_time_conversionという名前の対応するメソッド:

ruby
methods: {
  epoch_time_conversion: lambda do |val|
    val.to_time.to_i
  end
}

これにより、"2021-10-27T00:00:00-07:00"などの入力が1635318000にレンダリングされます。

カスタムlambdaを使用して、ネストされた構造に対してカスタム変換を実行することもできます。 たとえば、APIで次の形式のペイロードを送信する必要がある場合です。

json
{
  "data": {
    "name": {
      "value": "abc123"
    },
    "address": {
      "value": "def456"
    }
  }
}

対応するinput_field表現は過度にネストされ、ユーザーにとって扱いにくくなる可能性があります。

ネストされたフィールド前の例で表される入力フィールド

カスタムlambdaを使用すると、比較的フラットな入力フィールド構造を提示し、その後で変換を実行できるため、コネクターのUXを向上させることができます。

例:

ruby
[
  {
    name: 'data',
    type: 'object',
    properties: [
      {
        name: "name"
      },
      {
        name: "address"
      }
    ],
    convert_input: "key_value_conversion"
  }
]

およびkey_value_conversionという名前の対応するメソッド:

ruby
methods: {
  key_value_conversion: lambda do |val|
    # val in this case is the entire "data" object
    val.map do |key, value|
      {
        key => {
          "value" => value
        }
      }
    end.inject(:merge)
  end
}

結果のJSON:

json
{
  "data": {
    "name": {
      "value": "abc123"
    },
    "address": {
      "value": "def456"
    }
  }
}

フラット化されたフィールドカスタムlambdaにより同じ出力を生成する入力フィールド

さらに、arrays型のスキーマでconvert_inputconvert_outputを呼び出すことができます。 これにより、入力の配列全体に対して変換を実行できます。

例:

ruby
[
  {
    name: 'products',
    type: 'array',
    of: 'object',
    convert_input: "product_conversion",
    properties: [
      {
        name: "name"
      },
      {
        name: "qty"
      }
    ]
  }
]

およびstring_concat_conversionという名前の対応するメソッド:

ruby
methods: {
  product_conversion: lambda do |val|
    # Render_input is called on each index of the array THEN the whole array
    if val.is_a?(Array)
      val
    else
      {
        val['name'] => val['qty']
      }
    end
  end,
}

ユーザーの入力は次のようになります。

json
{
  "products": [
    {
      "name": "car",
      "qty": "100"
    },
    {
      "name": "wrench",
      "qty": "10"
    }
  ]
}

結果のJSON:

json
{
  "products": [
    "car": "100"
    "wrench": "10"
  ]
}

Last updated: