Skip to content

Commit 9007635

Browse files
authored
Allow keyword list options to use nil as key and/or value (#456)
1 parent df2a3f6 commit 9007635

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

lib/phoenix_html/form.ex

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -334,17 +334,25 @@ defmodule Phoenix.HTML.Form do
334334
[acc | option(option_key, option_value, [], selected_values)]
335335

336336
options, acc when is_list(options) ->
337-
{option_key, options} = Keyword.pop(options, :key)
338-
339-
option_key ||
340-
raise ArgumentError,
341-
"expected :key key when building <option> from keyword list: #{inspect(options)}"
342-
343-
{option_value, options} = Keyword.pop(options, :value)
344-
345-
option_value ||
346-
raise ArgumentError,
347-
"expected :value key when building <option> from keyword list: #{inspect(options)}"
337+
{option_key, options} =
338+
case List.keytake(options, :key, 0) do
339+
nil ->
340+
raise ArgumentError,
341+
"expected :key key when building <option> from keyword list: #{inspect(options)}"
342+
343+
{{:key, key}, options} ->
344+
{key, options}
345+
end
346+
347+
{option_value, options} =
348+
case List.keytake(options, :value, 0) do
349+
nil ->
350+
raise ArgumentError,
351+
"expected :value key when building <option> from keyword list: #{inspect(options)}"
352+
353+
{{:value, value}, options} ->
354+
{value, options}
355+
end
348356

349357
[acc | option(option_key, option_value, options, selected_values)]
350358

test/phoenix_html/form_test.exs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,10 @@ defmodule Phoenix.HTML.FormTest do
248248

249249
describe "options_for_select/2" do
250250
test "simple" do
251-
assert options_for_select(~w(value novalue), "novalue") |> safe_to_string() ==
251+
assert options_for_select(["value", "novalue", nil], "novalue") |> safe_to_string() ==
252252
~s(<option value="value">value</option>) <>
253-
~s(<option selected value="novalue">novalue</option>)
253+
~s(<option selected value="novalue">novalue</option>) <>
254+
~s(<option value=""></option>)
254255

255256
assert options_for_select(["value", :hr, "novalue"], "novalue") |> safe_to_string() ==
256257
~s(<option value="value">value</option>) <>
@@ -261,14 +262,16 @@ defmodule Phoenix.HTML.FormTest do
261262
[
262263
[value: "value", key: "Value", disabled: true],
263264
:hr,
264-
[value: "novalue", key: "No Value"]
265+
[value: "novalue", key: "No Value"],
266+
[value: nil, key: nil]
265267
],
266268
"novalue"
267269
)
268270
|> safe_to_string() ==
269271
~s(<option disabled value="value">Value</option>) <>
270272
~s(<hr/>) <>
271-
~s(<option selected value="novalue">No Value</option>)
273+
~s(<option selected value="novalue">No Value</option>) <>
274+
~s(<option value=""></option>)
272275

273276
assert options_for_select(~w(value novalue), ["value", "novalue"]) |> safe_to_string() ==
274277
~s(<option selected value="value">value</option>) <>

0 commit comments

Comments
 (0)