Method: CLI::UI::Prompt.ask
- Defined in:
- lib/cli/ui/prompt.rb
.ask(question, options: nil, default: nil, is_file: false, allow_empty: true, multiple: false, filter_ui: true, select_ui: true, &options_proc) ⇒ Object
Ask a user a question with either free form answer or a set of answers (multiple choice) Can use arrows, y/n, numbers (1/2), and vim bindings to control multiple choice selection Do not use this method for yes/no questions. Use confirm
-
Handles free form answers (options are nil)
-
Handles default answers for free form text
-
Handles file auto completion for file input
-
Handles interactively choosing answers using
InteractiveOptions

Attributes
-
question- (required) The question to ask the user
Options
-
:options- Options that the user may select from. Will useInteractiveOptionsto do so. -
:default- The default answer to the question (e.g. they just press enter and don’t input anything) -
:is_file- Tells the input to use file auto-completion (tab completion) -
:allow_empty- Allows the answer to be empty -
:multiple- Allow multiple options to be selected -
:filter_ui- Enable option filtering (default: true) -
:select_ui- Enable long-form option selection (default: true)
Note:
-
:optionsor providing aBlockconflicts with:defaultand:is_file,you cannot set with either of these keywords -
:defaultconflicts with +:allow_empty:, you cannot set these together -
:optionsconflicts with providing aBlock, you may only set one -
:multiplecan only be used with:optionsor aBlock; it is ignored, otherwise.
Block (optional)
-
A Proc that provides a
OptionsHandlerand uses the public:optionmethod to add options and their respective handlers
Return Value
-
If a
Blockwas not provided, the selected option or response to the free form question will be returned -
If a
Blockwas provided, the evaluated value of theBlockwill be returned
Example Usage:
Free form question
CLI::UI::Prompt.ask('What color is the sky?')
Free form question with a file answer
CLI::UI::Prompt.ask('Where is your Gemfile located?', is_file: true)
Free form question with a default answer
CLI::UI::Prompt.ask('What color is the sky?', default: 'blue')
Free form question when the answer can be empty
CLI::UI::Prompt.ask('What is your opinion on this question?', allow_empty: true)
Interactive (multiple choice) question
CLI::UI::Prompt.ask('What kind of project is this?', options: %w(rails go ruby python))
Interactive (multiple choice) question with defined handlers
CLI::UI::Prompt.ask('What kind of project is this?') do |handler|
handler.option('rails') { |selection| selection }
handler.option('go') { |selection| selection }
handler.option('ruby') { |selection| selection }
handler.option('python') { |selection| selection }
end
: (String question, ?options: Array?, ?default: (String | Array)?, ?is_file: bool, ?allow_empty: bool, ?multiple: bool, ?filter_ui: bool, ?select_ui: bool) ?{ (OptionsHandler handler) -> void } -> (String | Array)
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/cli/ui/prompt.rb', line 103 def ask( question, options: nil, default: nil, is_file: false, allow_empty: true, multiple: false, filter_ui: true, select_ui: true, & ) = !!( || block_given?) if && is_file raise(ArgumentError, 'conflicting arguments: is_file is only useful when options are not provided') end if && multiple && default && !(Array(default) - ).empty? raise(ArgumentError, 'conflicting arguments: default should only include elements present in options') end if multiple && ! raise(ArgumentError, 'conflicting arguments: options must be provided when multiple is true') end if !multiple && default.is_a?(Array) raise(ArgumentError, 'conflicting arguments: multiple defaults may only be provided when multiple is true') end if ask_interactive( question, , multiple: multiple, default: default, filter_ui: filter_ui, select_ui: select_ui, & ) else ask_free_form( question, default, #: as String? is_file, allow_empty, ) end end |