---
title: Forced Decision methods for the Ruby SDK
slug: feature-experimentation/docs/forced-decision-methods-ruby
docTags: 
createdAt: 2026-08-05T20:39:58.000Z
---

These methods help test and debug various flows of your client applications by forcing users into a specific variation.

The Ruby SDK checks forced decisions before making any decisions. If a matching item is found for the requested flag, the Ruby SDK returns the forced decision immediately ([audience conditions](docId\:UDBvr5a8WHNkyOqzPhOr9) and traffic allocations are ignored) before making normal decisions.

The Ruby SDK checks for forced decisions at the start of each decision process. If a matching forced decision is found, it returns the decision immediately.

- **Flag-to-Decision** – The SDK checks at the start of any decide call for the given flag.
- **Experiment-Rule-to-Decision** – The SDK checks at the start of the decision for the given experiment rule of the flag key.
- **Delivery-Rule-to-Decision** – The SDK checks at the start of the decision for the given delivery rule of the flag key.

:::hint{type="danger"}
**Warning**
You must associate your variations to a [flag rule](docId:-yq2-thNRv7-SgwCXpG90) before calling any Forced Decision methods.
:::

On forced decisions, the SDK fires impression events and notifications just like other normal decisions (unless disabled by the [DISABLE\\\_DECISION\\\_EVENT](docId\:W-MCwQUNp-EC5yaDomerg) option).

:::hint{type="info"}
**Note**
These forced decisions are not persistent and are cleared when the [OptimizelyUserContext](docId\:CBB2m_VFyZWW2HqXI529Q) is re-initialized.
:::

For information about each method, click on the method name.

- [set\\\_forced\\\_decision](docId\:pkghE0DF7eZGgQeFGA0Bs)
- [get\\\_forced\\\_decision](docId\:pkghE0DF7eZGgQeFGA0Bs)
- [remove\\\_forced\\\_decision](docId\:pkghE0DF7eZGgQeFGA0Bs)
- [remove\\\_all\\\_forced\\\_decisions](docId\:pkghE0DF7eZGgQeFGA0Bs)

### OptimizelyDecisionContext

```ruby
OptimizelyDecisionContext = Struct.new(:flag_key, :rule_key)
```

### OptimizelyForcedDecision

```ruby
OptimizelyForcedDecision = Struct.new(:variation_key)
```

## Set forced decision method - set\_forced\_decision()

### Version

3.10.0

### Description

Sets a forced decision (`variation_key`) for a given `OptimizelyDecisionContext`.

### Parameters

This table lists the required and optional parameters for the Ruby SDK.

| Parameter                  | Type   | Description                                                                                                                                      |
| -------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| **context** \*required\*   | Struct | An instance of \`OptimizelyDecisionContext\` with the required \`flag\_key\` and optional \`rule\_key\` for the forced decision you want to set. |
| **decision**\ \*required\* | Struct | An instance of \`OptimizelyForcedDecision\` with the required \`variation\_key\` for the forced decision you want to set.                        |

### Returns

A boolean value that indicates if setting the forced decision (`variation_key`) was completed.

### Example

See the full Ruby SDK example [here](docId\:pkghE0DF7eZGgQeFGA0Bs).

## Get forced decision method - get\_forced\_decision()

### Version

3.10.0

### Description

Returns the forced decision (`variation_key`) for a given `OptimizelyDecisionContext`. Returns nil if there is no matching item.

### Parameters

This table lists the required and optional parameters for the Ruby SDK.

| Parameter                | Type   | Description                                                                                                                                      |
| ------------------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| **context** \*required\* | struct | An instance of \`OptimizelyDecisionContext\` with the required \`flag\_key\` and optional \`rule\_key\` for the forced decision you want to get. |

### Returns

A forced decision `OptimizelyForcedDecision` instance for the context or nil if there is no matching item.

### Example

See the full Ruby SDK example [here](docId\:pkghE0DF7eZGgQeFGA0Bs).

## Remove forced decision method - remove\_forced\_decision()

### Version

3.10.0

### Description

Removes the forced decision (`variation_key`) for a given `OptimizelyDecisionContext`.

### Parameters

This table lists the required and optional parameters for the Ruby SDK.

| Parameters               | Type   | Description                                                                                                                                         |
| ------------------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| **context** \*required\* | struct | An instance of \`OptimizelyDecisionContext\` with the required \`flag\_key\` and optional \`rule\_key\` for the forced decision you want to remove. |

### Returns

A success/failure boolean status if the forced decision (`variation_key`) was removed.

### Example

See the full Ruby SDK example [here](docId\:pkghE0DF7eZGgQeFGA0Bs).

## Remove all forced decisions method - remove\_all\_forced\_decisions()

### Version

3.10.0

### Description

Removes all forced decisions (`variation_key`) for the user context.

### Parameters

This table lists the required and optional parameters for the Ruby SDK.

| Parameters | Type | Description |
| ---------- | ---- | ----------- |
| None       | N/A  | N/A         |

### Returns

A success/failure boolean status.

### Example

See the full Ruby SDK example [here](docId\:pkghE0DF7eZGgQeFGA0Bs).

## Full Code Example

```ruby
require 'optimizely'
require 'optimizely/optimizely_factory'

optimizely = Optimizely::OptimizelyFactory.default_instance('sdk_key')

user = optimizely.create_user_context('test_user', attributes)

flag_context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new('flag-1', nil)
flag_and_ab_test_context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new('flag-1','ab-test-1')
flag_and_delivery_rule_context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new('flag-1','delivery-1')
variation_a_forced_decision = Optimizely::OptimizelyUserContext::OptimizelyForcedDecision.new('variation-a')
variation_b_forced_decision = Optimizely::OptimizelyUserContext::OptimizelyForcedDecision.new('variation-b')
variation_on_forced_decision = Optimizely::OptimizelyUserContext::OptimizelyForcedDecision.new('on')

# set a forced decision for a flag
success = user.set_forced_decision(flag_context, variation_a_forced_decision)
decision = user.decide('flag-1')

# set a forced decision for an ab-test rule
success = user.set_forced_decision(flag_and_ab_test_context, variation_b_forced_decision)
decision = user.decide('flag-1')

# set a forced variation for a delivery rule
success = user.set_forced_decision(flag_and_delivery_rule_context, variation_on_forced_decision)
decision = user.decide('flag-1')

# get forced variations
forced_decision = user.get_forced_decision(flag_context)
puts "[ForcedDecision] variation_key = #{forced_decision}"

# remove forced variations
success = user.remove_forced_decision(flag_and_ab_test_context)
success = user.remove_all_forced_decisions
```

## See Also

[OptimizelyUserContext](docId\:CBB2m_VFyZWW2HqXI529Q)
