我有一个嵌套在我的表单中的select标签,我需要删除我的options_for_select数组中的项目,如果它等于单词English
代码:
<%= 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 %>
问题: 上面的代码工作正常,但由于某种原因,第一个选项仍然显示在mutli-select中,生成一个空白的选择选项。反正有没有摆脱选择选项及其价值?我甚至做得对吗?
提前感谢您的所有帮助!
答案 0 :(得分:3)
您可以使用收集和拒绝来执行此操作。
Language.all.collect { |lang| [lang.english, lang.id] }.reject { |(lang, id)| lang == 'English' }
不确定如何使用just。
答案 1 :(得分:3)
我意识到这已经有一年了,但为了未来的googlers ...
使用命名范围可能会更好,而不是内联SQL:
scope :not_english, where("english != 'English'") # Rails 3
或
named_scope :not_english, :conditions => "english != 'English'" # Rails 2
可以让你这样做:
options_for_select(Language.not_english.collect {|lang| [lang.english, lang.id]})
这更容易阅读,更具表现力,并且不依赖于某些神奇的数据库ID。
干杯!
(PS:另外,您可能需要考虑更新架构,以便db列的名称不会与它的值混淆。我可以建议使用language.name,而不是language.english吗?)
答案 2 :(得分:1)
看起来您的选择实际上是返回一个空数组作为第一个元素。首先尝试拔出不需要的选项:
Language.all.reject {|lang| lang.english == "English}.collect {|lang| [lang.english, lang.id]}
答案 3 :(得分:0)
感谢回复家伙们!我最终做的是在我的查询中处理它
代码:
<%= 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 %>
数据库中的第一行总是相同的,所以在查询中这很容易做到......虽然上面的建议将来会派上用场!再次感谢!