我在表中有一个列,其值和CSS类应根据布尔值而变化。我的初始版本是:
%td.sba{ class: product.sold_by_amazon? ? :yes : :no }= product.sold_by_amazon? ? '✔' : '–'
我想删除重复的布尔查找,最后得到:
- Proc.new{ |p| yield ([{ yes: :✔ }, { no: :– }].try( :[], product.sold_by_amazon? ? 0 : 1 )) }.call do |sold, text|
%td.sba{ class: sold }= text
是否有一种不那么复杂的方法呢?
此外,更简单的解决方案是使用CSS content
生成文本。
答案 0 :(得分:0)
你可以将这个逻辑移到帮助器上,然后编写如下内容:
def sold_by_amazon_row(product)
if product.sold_by_amazon?
content_tag :td, '✔', class: "sba yes"
else
content_tag :td, '-', class: "sba no"
end
end
然后:
= sold_by_amazon_row(product)
当然,您可以将此方法添加到原始类中,如:
class TrueClass
def yes_no
"Yes"
end
def sign
"+"
end
end
class FalseClass
def yes_no
"No"
end
def sign
"-"
end
end
或使用猴子修补并写下如下内容:
class << bool
def yes_no
self ? "Yes" : "No"
end
def sign
self ? "+" : "-"
end
end
但是你不应该用苍蝇制作大象,就像我的选择使用简单的?:
看起来更清晰:
Proc.new{ |p| yield ([{ yes: :✔ }, { no: :– }].try( :[], product.sold_by_amazon? ? 0 : 1 )) }.call do |sold, text|
答案 1 :(得分:0)
为什么你关心&#34;重复的布尔查找&#34;?
如果它是一个有效率的东西,那么记住谓词函数的结果.sold_by_amazon?
#product.rb
def sold_by_amazon?
return false if @sold_by_amazon == false
@sold_by_amazon || = calculate_if_sold_by_amazon
end
private
def calculate_if_sold_by_amazon
# some expensive calculation to work out whether or not this is sold by Amazon
end