marmelab/react-admin · error · Error

useGetRecordId could not find the current record id. You nee

Error message

useGetRecordId could not find the current record id. You need to use it inside a RecordContextProvider, or inside a supported route, or provide the record id to the hook yourself.

What it means

useGetRecordId resolves the current record id from, in order: the explicit recordId argument, the RecordContext, or the :id route param. If all three are absent there is no way to determine the id, so the hook throws with guidance on the three supported sources.

Source

Thrown at packages/ra-core/src/dataProvider/useGetRecordId.ts:22

/**
 * Helper hook to get the current `recordId`.
 *
 * `recordId` is obtained from parameters if passed as a parameter, or from the `RecordContext` if there is one, or, lastly, from the router URL.
 *
 * @param {any} recordId optional if used inside a RecordContextProvider or if recordId can be guessed from the URL
 *
 * @returns The `recordId` determined in this manner.
 *
 * @example
 * const recordId = useGetRecordId();
 */
export function useGetRecordId(recordId?: Identifier): Identifier {
    const contextRecord = useRecordContext<RaRecord>();
    const { id: routeId } = useParams<{ id?: string }>();
    const actualRecordId = recordId ?? contextRecord?.id ?? routeId;
    if (actualRecordId == null)
        throw new Error(
            `useGetRecordId could not find the current record id. You need to use it inside a RecordContextProvider, or inside a supported route, or provide the record id to the hook yourself.`
        );

    return actualRecordId;
}

View on GitHub (pinned to 051f511bb0)

Solutions

  1. Wrap the component in <RecordContextProvider value={record}>.
  2. Pass the id explicitly: useGetRecordId(record.id).
  3. Render the component only on routes with an :id path param (edit/show routes).

Example fix

// before
const id = useGetRecordId(); // throws: no context, no route id
// after
const id = useGetRecordId(record?.id);
Defensive patterns

Strategy: type-guard

Validate before calling

const record = useRecordContext();
const { id: routeId } = useParams<{ id?: string }>();
if (record?.id == null && routeId == null) return <MissingIdFallback />;

Type guard

const canResolveId = (r?: { id?: unknown }, routeId?: string): boolean =>
  r?.id != null || routeId != null;

Try / catch

// hooks cannot be wrapped in try/catch; gate the component instead
if (!canResolveId(record, routeId)) return null;

Prevention

When it happens

Trigger: Calling useGetRecordId() in a component rendered outside any RecordContextProvider; using it on a route without an :id segment (e.g. list or create pages); passing an explicit undefined recordId while no record is in context.

Common situations: Custom edit-page widgets moved to a list page; components rendered in a portal or modal outside the RecordContext; forgetting to pass record prop so RecordContext is empty; routing changes that renamed the :id param.

Related errors


AI-assisted analysis of marmelab/react-admin@051f511bb0 (2026-08-30). Data as JSON: /api/errors/c99853521672eada. Report an issue: GitHub.