Ik gebruik de opsommingen in Rails 4.1 om de kleuren van wijn bij te houden.
Wine.rb
class Wine < ActiveRecord::Base
enum color: [:red, :white, :sparkling]
end
Naar mijn mening genereer ik een select zodat de gebruiker een wijn met een bepaalde kleur kan selecteren
f.input :color, :as => :select, :collection => Wine.colors
Dit genereert de volgende HTML:
<select id="wine_color" name="wine[color]">
<option value=""></option>
<option value="0">red</option>
<option value="1">white</option>
<option value="2">sparkling</option>
</select>
Bij het verzenden van het formulier krijg ik echter een argumentfout waarin staat dat '1' is not a valid color
. Ik realiseer me dat dit komt omdat color
gelijk moet zijn aan 1
en niet aan "1"
.
Is er een manier om Rails te dwingen de kleur te interpreteren als een geheel getal in plaats van een string?
Antwoord 1, autoriteit 100%
Ok, dus blijkbaar moet je de gehele waarde van de op te slaan opsomming niet verzenden. U moet de tekstwaarde van de enum verzenden.
Ik heb de invoer als volgt gewijzigd:
f.input :color, :as => :select, :collection => Wine.colors.keys.to_a
Hierdoor werd de volgende HTML gegenereerd:
<select id="wine_color" name="wine[color]">
<option value=""></option>
<option value="red">red</option>
<option value="white">white</option>
<option value="sparkling">sparkling</option>
</select>
Waarden gingen van “0” naar “rood” en nu zijn we helemaal klaar.
Als je een gewoon tekstveld van oude rails gebruikt, is dit:
f.select :color, Wine.colors.keys.to_a
Als u duidelijke, voor mensen leesbare kenmerken wilt hebben, kunt u ook het volgende doen:
f.select :color, Wine.colors.keys.map { |w| [w.humanize, w] }
Antwoord 2, autoriteit 18%
Het is niet nodig om de enum-hash naar een array te converteren met to_a
. Dit is voldoende:
f.select :color, Wine.colors.map { |key, value| [key.humanize, key] }
Antwoord 3, autoriteit 6%
De geaccepteerde oplossing werkte niet voor mij voor de menselijke leesbaarheid, maar ik kon het als volgt laten werken:
<%= f.select(:color, Wine.colors.keys.map {|key| [key.humanize, key]}) %>
Dit was de schoonste, maar ik moest mijn sleutels echt menselijk maken:
<%= f.select(:color, Wine.colors.keys) %>