Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Model#initialize drops every `false` value — booleans are silently lost on requests and responses

クローズ 初心者向け
#800 コメント 4 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@kishore7snehil がすでに取り組んでいます。

2026年10月7日 から。

  • #811 @kishore7snehil による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
88/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
ruby
領域
api, backend

調査の方向性

lib/auth0/internal/types/model.rb から始め、Auth0::Users::Types::UpdateUserRequestContent と Auth0::Types::UpdateUserResponseContent を使ってリクエストとレスポンスの例を再現します。false の値が to_h に存在したままになること、load 後に readers から返されること、また default: false を持つフィールドもデフォルト値を使用することを確認します。

索引モデルが issue の本文から書いたものです。

説明

Describe the problem

Auth0::Internal::Types::Model#initialize resolves each declared field with ||, so a legitimate false is treated as absent and never reaches @data. Since #to_h only emits keys present in @data, every boolean whose value is false silently disappears — on requests and responses alike.

Requests: users.update(id:, blocked: false) builds an empty PATCH body, and Auth0 rejects it with 400 Payload validation error: 'None of the valid schemas were met'. Unblocking a user is not possible through the SDK.

Responses: a user who genuinely is "email_verified": false deserializes to nil, indistinguishable from "the API did not return this field". This one is quiet — no exception, just a wrong value.

Reproduction
require "auth0/version"   # still needed on 6.2.0, see #786
require "auth0"

k = Auth0::Users::Types::UpdateUserRequestContent

k.new(id: "auth0|abc", blocked: false, email_verified: false).to_h
# => {"id" => "auth0|abc"}                       # both booleans dropped
k.new(id: "auth0|abc", blocked: true).to_h
# => {"id" => "auth0|abc", "blocked" => true}    # true survives

json = '{"user_id":"auth0|abc","email":"[email protected]","email_verified":false,"blocked":false}'
u = Auth0::Types::UpdateUserResponseContent.load(json)
u.email_verified  # => nil   (expected false)
u.blocked         # => nil   (expected false)
u.to_h            # => {"user_id" => "auth0|abc", "email" => "[email protected]"}

Users::Client#update does request_data.except("id"), so the first case sends PATCH /api/v2/users/auth0|abc with a literal {} body.

Expected behaviour

false round-trips like any other value: to_h includes the key and the reader returns false.

Cause

lib/auth0/internal/types/model.rb:

value = values.delete(field.api_name.to_sym) || values.delete(field.api_name) || values.delete(field_name)

field_value = value || (if field.literal?
                          field.value
                        elsif field.default
                          field.default
                        end)

Both || chains discard false. Presence has to be decided with Hash#key?, and the literal/default fallback should apply only when the value is genuinely nil:

key = [field.api_name.to_sym, field.api_name, field_name].find { |k| values.key?(k) }
value = key.nil? ? nil : values.delete(key)

field_value =
  if !value.nil?
    value
  elsif field.literal?
    field.value
  else
    field.default
  end

(Also note the elsif field.default guard is itself truthiness-based, so a field declared with default: false can never fall back to its default either.)

Because this lives in the shared base model it affects every boolean in the generated API surface — blocked, email_verified, verify_email, phone_verified, include_totals, and so on.

Environment
  • auth0 6.2.0 — lib/auth0/internal/types/model.rb is byte-identical in 6.0.0, 6.1.0 and 6.2.0 (md5 0908fa9ec6636316bc78688d3e7436b3), so all three are affected
  • Ruby 3.4
主要言語
Ruby
スター
205
フォーク
147
平均マージ
16時間 2分
マージ済み PR(30日)
5

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

auth0/ruby-auth0 のほかの issue

auth0/ruby-auth0 の issue をすべて見る

似ている issue

Ruby の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。