Skip to content

Commit 5ce67bf

Browse files
committed
Allow keyword list options to use nil as key and/or value
1 parent df2a3f6 commit 5ce67bf

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

lib/phoenix_html/form.ex

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -334,17 +334,18 @@ 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 ||
337+
if not Keyword.has_key?(options, :key) do
340338
raise ArgumentError,
341339
"expected :key key when building <option> from keyword list: #{inspect(options)}"
340+
end
342341

343-
{option_value, options} = Keyword.pop(options, :value)
344-
345-
option_value ||
342+
if not Keyword.has_key?(options, :value) do
346343
raise ArgumentError,
347344
"expected :value key when building <option> from keyword list: #{inspect(options)}"
345+
end
346+
347+
{option_key, options} = Keyword.pop(options, :key)
348+
{option_value, options} = Keyword.pop(options, :value)
348349

349350
[acc | option(option_key, option_value, options, selected_values)]
350351

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)