Opsomming opslaan van select in Rails 4.1

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 colorgelijk moet zijn aan 1en 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) %>

Other episodes