代码之家  ›  专栏  ›  技术社区  ›  dennismonsewicz

rails/ruby删除\u if

  •  1
  • dennismonsewicz  · 技术社区  · 14 年前

    我的表单中嵌套了一个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中。是否仍要清除选择选项及其值?我做得对吗?

    感谢您的帮助!

    4 回复  |  直到 13 年前
        1
  •  3
  •   dj2    14 年前

    您可以使用收集和拒绝来完成它。

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

    不知道如何使用Just Collect。

        2
  •  3
  •   brookr    13 年前

    我知道这是一年前的事,但为了将来的谷歌用户…

    与其嵌入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。

    干杯!

    (另一方面,您可能需要考虑更新您的模式,这样数据库列的名称就不会与它的值混淆。我可以推荐language.name,而不是language.english吗?)

        3
  •  1
  •   zetetic    14 年前

    看起来您的选择实际上是返回一个空数组作为第一个元素。尝试先退出不需要的选项:

    Language.all.reject {|lang| lang.english == "English}.collect {|lang| [lang.english, lang.id]}
    
        4
  •  0
  •   dennismonsewicz    14 年前

    谢谢你们的回复!我最后做的是在我的查询中处理它

    代码:

    <%= 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 %>
    

    数据库中的第一行将始终相同,因此在查询中很容易做到这一点…尽管上述建议将来会很有用!再次感谢!