将函数的返回值分配给块的参数

时间:2014-09-20 02:30:19

标签: ruby-on-rails ruby haml

我在表中有一个列,其值和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生成文本。

2 个答案:

答案 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