2016-04-11 23 views
0

Rails 4.Raylar 4 - enum nasıl kullanılır?

bir uygulama yapmaya çalışıyorum ben bu soru haberi ve bir tavsiyem var: Ben bu tavsiyeyi uygulamak anlamaya çalışıyorum Rails 4 -Simple Form how to save key and display value

. Şu anda

, ben bir tercihi modeli vardır: benim tercih formunda

enum self_governance: { 
          tier_1: 1, 
          tier_2: 2, 
          tier_3: 3, 
          tier_4: 4, 
          tier_5: 5 
         } 

    enum autonomy: { 
          tier_11: 1, 
          tier_21: 2, 
          tier_31: 3, 
          tier_41: 4, 
          tier_51: 5 
         }   

, ben:

<%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governance.to_a.map { |p| [p.humanize, p] } %> 

Ben tercihleri ​​var görünümü gösterir:

<%= @organisation.preference.self_governance.try(:humanize) %> 

Tüm bunları kaydedip denediğimde, şu hatayı alıyorum:

NoMethodError at /preferences/1/edit 
undefined method `self_governance' for #<Class:0x007fde5b9fb500> 
Did you mean? self_governances 

Bu işin nasıl yapıldığını herkes görebilir mi?

Tercih modelindeki numaraya def/end etiketleri eklemem gerekir mi?

cevap

0

Kadar yakınsınız :) Düzeltme hatadır.

Sizin seçme

Preference.self_governance.to_a.map { |p| [p.humanize, p] } 

çağırıyor Ve hata çoğulculuk yanlıştır size söyler.Tek bir nesne üzerinde enum çağırırsanız, o

@preference.self_governance 

olacağını unutmayın Ama modelin kendisi Tercihi çağırıyoruz ve bir koleksiyon talep eğer çoğul bu. enum özeldir

Preference.self_governances 

Çünkü uour enum Sadece yerine sağlamalarının, diziler olabilir: Bu dizin numarasını saklar

<%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governances.map { |key, value| [key.humanize, key] } %> 

: gibi

enum self_governance: [ tier_1, tier_2, tier_3, tier_4, tier_55 ] 

enum autonomy: [ tier_11, tier_21, tier_31, tier_41, tier_51 ] 

görünümünüz olmazdı dizi, sihir gibi :)

+0

Teşekkürler! Bu çalıştı, ama şimdi bu hatayı alıyorum: ["tier_1" için tanımlanmamış yöntem "humanize", 1]: Array. Seçme satırından 'humanise' sildiğimde, hem anahtarı hem de değeri gösteren bir form alırım. Sadece değeri göstermek ama anahtarı saklamak istiyorum. 'Enum' kullanmaya çalışmak için yanlış bir şey mi? – Mel

+0

Bir hash kullanmayla ilgili bir nedeniniz yoksa, bir diziye geçebilirsiniz, çoğu zaman enum'lar basittir ve sadece bir dizidir. Basit bir anahtar kullandığınız için (sayı 3 gibi) o zaman dizi indeksini ihtiyacınız olduğunda kullanabilirsiniz (örneğin, db'de saklanacak olan şey) – trh

+0

Bunu nasıl yaparım? sayıyı saklamak için metni ve db görüntülemek için görünümü almaya çalışıyor – Mel

0

Rakamlar 'enum' kodunu kullanmayla ilgili deneyimim yok. Raylar sizin için enum koleksiyonunu çoğaltır, örneğin sizinki self_governances olabilir.

@preference = Preference.new 
@preference.self_governance = Preference.self_governances[:tier_1] 

Eğer enum kullanın:

Bunun anlamı @preference.self_governance

örneği gibi tekil bir Preference.self_governances tanımları ve aslında değeri tutan özniteliği ile karma iade edeceğini olduğunu dahili olarak hangi rayların yapılacağı, değerlerle bir karma döndürecek tanımladığınız adla çoğaltılmış bir sınıf yöntemi tanımı eklemektir ve sizin tarafınızdan yazıldığı şekilde tanımladığınız adı, sizin için yazdığınız bir öznitelik erişimcisi için kullanır. gerçek al/al Sayfanızın nesnesi üzerindeki numaralandırma değeri.

enum status: { 
    active: 1, 
    inactive: 2 
} 

Yani yukarıdaki örnek raylar için sadece enum değer döndüren bir Test.statuses yöntemleri eklersiniz:

Başka ortak kullanım

bir Test sınıf göz önüne alındığında, statü içindir. Sonra, bir Test nesnenin örneğine için sizin olsun veya Umarım Test.statuses

mantıklı tarafından döndürülen karma bir durumunu ayarlamak için kullanabileceğiniz adınız adıyla bir erişimci @instance.status olurdu.