Saya menggunakan enum di Rails 4.1 untuk melacak warna anggur.
Wine.rb
class Wine < ActiveRecord::Base
enum color: [:red, :white, :sparkling]
end
Dalam pandangan saya, saya menghasilkan pilihan sehingga pengguna dapat memilih anggur dengan warna tertentu
f.input :color, :as => :select, :collection => Wine.colors
Ini menghasilkan HTML berikut:
<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>
Namun, setelah mengirimkan formulir, saya menerima kesalahan argumen yang menyatakan '1' is not a valid color
. Saya menyadari ini karena color
harus sama 1
dan tidak "1"
.
Apakah ada cara untuk memaksa Rails menafsirkan warna sebagai bilangan bulat daripada string?
sumber
f.select :color, Wine.colors.to_a.map { |w| [w[0].humanize, w[0]] }
karenaw
mewakili sebuah array. Tidak yakin mengapa, tapi mungkin ini akan membantu seseorang.titleize
mungkin ide yang lebih baik jika Anda memiliki dua kata atau lebihkeys
metode mengembalikan array sehinggato_a
berlebihan. Alternatifnya, metode pembantu pilih mengambil larik 2D untuk opsi sehingga Anda bisa menggunakannyato_a
.enum color: [:red, :white, :sparkling]
sehingga kalimat yang benar adalahf.input :color, :as => :select, :collection => Wine.color.keys.to_a
Tidak perlu mengubah hash enum menjadi array
to_a
. Ini cukup:sumber
Saya baru saja mengumpulkan EnumHelper yang menurut saya akan saya bagikan untuk membantu orang yang membutuhkan lebih banyak label dan lokal enum yang disesuaikan untuk pilihan enum Anda.
Di tempat Anda:
Dalam pandangan Anda:
sumber
[I18n.t("activerecord.enums.#{klass.underscore}.#{enum}.#{key}", default: key.humanize), key]
Juga, hapus yang terakhirhumanize
karena dapat mengubah kapitalisasi jika beberapa kataSolusi yang diterima tidak berhasil untuk saya karena dapat dibaca manusia , tetapi saya dapat membuatnya berfungsi seperti ini:
Ini adalah yang terbersih, tetapi saya benar-benar perlu memanusiakan kunci saya:
sumber
Jika Anda menggunakan enum di Rails 4 maka panggil saja
Model.enums
:Untuk membuat HTML:
Atau tambahkan metode di pengontrol:
sumber
Inilah yang berhasil untuk saya, Rails 4+:
di
my _form.html.erb
, saya punya ini:uji dari Konsol setelah menambahkan catatan:
sumber
Jika Anda perlu menangani i18n berdasarkan kunci enum, Anda dapat menggunakan:
dan dalam terjemahan Anda dapat mengatur warna:
sumber
Inilah solusi saya (peran saya memiliki garis bawah di dalamnya seperti "sales_rep"), dan untuk beberapa alasan inilah cara saya perlu mendapatkan opsi kosong untuk bekerja (dengan simpleform?):
Di ApplicationHelper:
Kemudian dalam bentuk saya:
sumber