2010-10-15 2 views
1

je une balise select nichée dans ma forme et je besoin de supprimer un élément de mon tableau de options_for_select si elle est égale le mot anglaisRails/Ruby delete_if

Code:

<%= fields_for :users_languages do |u| %> 
    <div class="field"> 
    <%= u.label :Assign_Languages %><br /> 
    <%= select_tag :language_id, 
     options_for_select(Language.all.collect {|lang| 
     [lang.english, lang.id].delete_if {lang.english == "English"} 
     }, @lang_list), 
     :multiple => true, 
     :prompt => 'Select Language' %> 
    </div> 
<% end %> 

Problème: Le code ci-dessus fonctionne bien, mais pour une raison quelconque, la première option est toujours affichée dans le multi-select produisant une option de sélection vide. Y at-il de toute façon se débarrasser de l'option de sélection et de sa valeur? Est-ce que je fais même cela correctement?

Merci pour toute l'aide à l'avance!

Répondre

3

Vous pouvez le faire en utilisant une collecte et un rejet.

Language.all.collect { |lang| [lang.english, lang.id] }.reject { |(lang, id)| lang == 'English' } 

Vous ne savez pas comment le faire en utilisant simplement recueillir.

+0

Cette fonctionne aussi :) – zetetic

1

Il semble que votre sélection renvoie un tableau vide en tant que premier élément. Essayez de retirer l'option non désirée d'abord:

Language.all.reject {|lang| lang.english == "English}.collect {|lang| [lang.english, lang.id]} 
0

Merci pour la réponse les gars! Ce que je fini par faire était Abordez la ma requête

code:

<%= fields_for :users_languages do |u| %> 
     <div class="field"> 
      <%= u.label :Assign_Languages %><br /> 
      <%= select_tag :language_id, options_for_select(Language.find(:all, :conditions => "id != 1").collect {|lang| [lang.english, lang.id]}, @lang_list),:multiple => true, :prompt => 'Select Language' %> 
     </div> 
    <% end %> 

la première ligne de la base de données sera toujours le même si cela était facile à faire dans la requête ... bien que les suggestions ci-dessus sera utile dans le futur! Merci encore!

3

Je sais que cela est d'un an, mais pour le bien de l'avenir ... Googlers

Plutôt que inline SQL, vous pourriez être mieux avec une portée du nom:

scope :not_english, where("english != 'English'") # Rails 3 

ou

named_scope :not_english, :conditions => "english != 'English'" # Rails 2 

qui vous permettra de le faire:

options_for_select(Language.not_english.collect {|lang| [lang.english, lang.id]}) 

C'est plus facile à lire, plus expressif, et ne dépend pas d'un identifiant de base de données magique.

À la votre!

(PS:.? En outre, vous pouvez envisager de mettre à jour votre schéma de sorte que le nom de la colonne db ne se confond pas avec sa valeur Puis-je suggérer language.name, plutôt que language.english)

+0

merci !! J'essaie toujours de me salir les mains avec des lunettes. Merci pour le conseil! – dennismonsewicz