布尔值不保存在显示中
Boolean value not saving in display
我有一个 Class 公司,其布尔属性为 female_founder。
公司要么有 female_founder(真),要么没有(假)。
我使用搜查 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"} %>
搜索 'Yes' female_founder returns 正确显示
在 'No' 中搜索 female_founder 会将搜索显示重置为提示值。
搜索查询正确,只是显示不正确。
此处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_founder
是 false
,而 false
是 blank?
,它会假设没有给出任何值并添加提示。 (这可能是他们故意的,也可能不是故意的。)
现在,这里的 value
是标签的 selected 值,如果定义了 :selected
选项,可以覆盖它,所以如果手动设置 :selected
到 0
的 No 值,那么它应该按预期抑制提示(因为 0
不是 blank?
)。这是一个似乎对我有用的常规形式的拼凑:
# 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] } %>
对于搜查,它需要看起来像这样:
<%= f.select :female_founder_eq, Company.female_founders.to_a, {prompt: "Any", selected: { true => 1, false => 0 }[@q.base[:female_founder_eq].try(:value)] } %>
我有一个 Class 公司,其布尔属性为 female_founder。 公司要么有 female_founder(真),要么没有(假)。
我使用搜查 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"} %>
搜索 'Yes' female_founder returns 正确显示
在 'No' 中搜索 female_founder 会将搜索显示重置为提示值。
搜索查询正确,只是显示不正确。
此处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_founder
是 false
,而 false
是 blank?
,它会假设没有给出任何值并添加提示。 (这可能是他们故意的,也可能不是故意的。)
现在,这里的 value
是标签的 selected 值,如果定义了 :selected
选项,可以覆盖它,所以如果手动设置 :selected
到 0
的 No 值,那么它应该按预期抑制提示(因为 0
不是 blank?
)。这是一个似乎对我有用的常规形式的拼凑:
# 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] } %>
对于搜查,它需要看起来像这样:
<%= f.select :female_founder_eq, Company.female_founders.to_a, {prompt: "Any", selected: { true => 1, false => 0 }[@q.base[:female_founder_eq].try(:value)] } %>