SORU
19 Ocak 2012, PERŞEMBE


Neden ilk eleman benim Raylar her zaman boş çoklu seçim, gömülü bir dizi kullanarak.

KullanıyorumRaylar 3.2.0.rc2. Bende Model " Ben bir statik Array hangi olduğumu sunan bir form gibi kullanıcılar, seçin bir alt Array ve Kaydet seçimi için veritabanı, saklı bir tek sütun Model. Array ve Raylar doğru kullanıcıların Yaml ve sütun okurken dizi) seçimleri. dönüştürmektedir depolayan veritabanı sütunu hale kullandım Çoklu seçim şeklinde bir giriş seçim yapmak için kullanıyorum.

Benim sorunum, ben şu anda bu şekilde, her şeyi sunucuya gönderildiğinde, kullanıcının alt dizi her zaman ilk boş bir öğesi olması dışında beklediğiniz gibi çalışır.

Bu değil büyük bir anlaşma, ve ben yazarım kodu kesip sonra aslında, ama hissediyorum sadece bir tür sözdizimsel hata gibi gelmiyor bana bu varsayılan Raylar davranış olacağını bilerek ekle Bu boş unsuru olmadan nedense. Bir şey kaçırmış olmalıyım ya da ayarı falan devre dışı bırakmak için unuttum. Bana ne kaçırıyorum (ya da bana intertubes bulmak mümkün oldum ne daha derinlemesine bu açıklayan bazı güzel belgeleri noktası) lütfen açıkla.

MySQL Veritabanı Tablo 'modeller':

  • içeren bir METİN alanı olan bir sütun subset_array adında

Sınıf Modeli aşağıdaki ayarları içerir:

  • serialize :subset_array
  • ALL_POSSIBLE_VALUES = [value1, value2, value3, ...]

Düzenleme Modelleri için aşağıdaki formu giriş seçeneği içerir:

  • f.select :subset_array, Model::ALL_POSSIBLE_VALUES, {}, :multiple => true, :selected => @model.subset_array

İstemciden sunucuya KOYMAK şöyle görünür:

  • sadece değer1 ve value3 varsayarak seçilir
  • "model" => { "subset_array" => ["", value1, value3] }

Veritabanı güncellemesi bu gibi görünüyor:

  • UPDATE 'models' SET 'subset_array' = '--- \n- \"\"\n- value1\n- value3\n'

Gördüğünüz gibi veritabanındaki dizi gönderdi ve ayarlanan ekstra boş, bu faktörü de var. Bundan nasıl kurtulabilirim? f.select telefonumu özlediğim bir parametre var mı?

Çok teşekkürler :)

EDİTBu f.select deyimi oluşturulan HTML kodu. Benim soruna neden olabilir gizli bir giriş oluşturuluyor var gibi görünüyor? Bu yüzden orada mı?

<input name="model[subset_array][]" type="hidden" value>
<select id="model_subset_array" multiple="multiple" name="model[subset_array][]" selected="selected">
    <option value="value1" selected="selected">Value1</option>
    <option value="value2">Value2</option>
    <option value="value3" selected="selected">Value3</option>
    <option...>...</option>
</select>

CEVAP
19 Ocak 2012, PERŞEMBE


Gizli alanda soruna neden budur. Ama iyi bir nedeni var: tüm değerler seçili olduğunda, hala subset_array bir parametre alır. Raylar docs (bütün bunları görmek için sağa doğru gitmeniz gerekebilir):

  # The HTML specification says when  multiple  parameter passed to select and all options got deselected
  # web browsers do not send any value to server. Unfortunately this introduces a gotcha:
  # if an  User  model has many  roles  and have  role_ids  accessor, and in the form that edits roles of the user
  # the user deselects all roles from  role_ids  multiple select box, no  role_ids  parameter is sent. So,
  # any mass-assignment idiom like
  #
  #   @user.update_attributes(params[:user])
  #
  # wouldn't update roles.
  #
  # To prevent this the helper generates an auxiliary hidden field before
  # every multiple select. The hidden field has the same name as multiple select and blank value.
  #
  # This way, the client either sends only the hidden field (representing
  # the deselected multiple select box), or both fields. Since the HTML specification
  # says key/value pairs have to be sent in the same order they appear in the
  # form, and parameters extraction gets the last occurrence of any repeated
  # key in the query string, that works for ordinary forms.

DÜZENLEME:Son paragraf bir şey seçildiğinde bu durumda boş bir görmemelisiniz gösteriyor, ama yanlış olduğunu düşünüyorum. Kişi kim yaptı Bu işlemek için Raylar (https://github.com/rails/rails/commit/faba406fa15251cdc9588364d23c687a14ed6885) yapmaya çalışıyorum aynı numara bu Raylar kullanımlar için onay kutuları (belirtildiği gibi burada: https://github.com/rails/rails/pull/1552), ama sanırım bu iş için bir çoklu seçim kutusu çünkü parametreleri gönderdi şeklinde bir dizi bu durumda ve bu yüzden hiçbir değeri dikkate alınmaz.

Yani benim düşüncem bu bir hata değildir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alfredo Garcia

    Alfredo Garc

    25 Mayıs 2007
  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • inovationgmbh

    inovationgmb

    28 EYLÜL 2010