布尔值未在显示中保存

时间:2018-04-03 11:27:08

标签: ruby-on-rails ruby ruby-on-rails-5 ransack

我有一个类公司,其布尔属性为female_founder。 公司要么有女性创始人(真实),要么没有(假)。

我使用ransack gem创建了一个搜索过滤器,以查询公司是否是女性成立的。当我查询'true'搜索时,枚举值保存并显示正常,但是当我搜索'false'值时,显示重置为我给出的提示值。

这是为什么?我该如何解决?我希望显示屏显示我选择的任何值。

模式

create_table "companies", force: :cascade do |t|
 ...
 t.boolean  "female_founder"
 ...
end 

Company.rb

class Company < ApplicationRecord
 enum female_founders: {
  'Yes' => 1,
  'No' => 0
 }
end

Search.html.erb

<%= f.label :female_founder_eq, 'Female Founder' %>
<%= f.select :female_founder_eq, Company.female_founders.to_a, {prompt: "Any"} %>

为female_founder搜索“是”返回正确的显示

datetime.timedelta()

为女性创始人搜索“否”会重置搜索显示以提示值。 搜索正确查询,只是显示不正确。 Search 'Yes' for female_founder

1 个答案:

答案 0 :(得分:1)

这是Rails在rails / actionview / lib / action_view / helpers / tags / base.rb中确定是否添加提示的地方:

      def add_options(option_tags, options, value = nil)
        if options[:include_blank]
          option_tags = tag_builder.content_tag_string("option", options[:include_blank].kind_of?(String) ? options[:include_blank] : nil, value: "") + "\n" + option_tags
        end
        if value.blank? && options[:prompt]
          option_tags = tag_builder.content_tag_string("option", prompt_text(options[:prompt]), value: "") + "\n" + option_tags
        end
        option_tags
      end

当Rails构建其select标签时,它决定是否使用blank?来包含提示,这无法区分它是nil还是false;因为@company.female_founderfalse,而falseblank?,所以它会假定没有给出任何值并添加提示。 (这可能是也可能不是故意的。)

现在,此处value是标记的选定值,如果定义了:selected选项,则可以覆盖该值,因此如果:selected被手动设置为您的No值{{ 1}},然后它应该按预期抑制提示(因为0不是0)。这是一个似乎适用于常规表格的kludge:

blank?

对于ransack,它需要看起来像这样:

# 1 if true - show 'Yes', 0 if false - show 'No', nil if nil - show 'Any'
<%= f.select :female_founder, Company.female_founders.to_a, { prompt: "Any", selected: { true => 1, false => 0 }[@company.female_founder] } %>