如果轨道中的条件和短路评估 - DRY

时间:2016-10-08 22:16:41

标签: ruby-on-rails ruby conditional-statements dry

我正在做一个应用程序,我需要添加多个条件,如果。我想知道DRY是否存在解决方案。

我试过这样的事情,但那不行,就像https://en.m.wikipedia.org/wiki/Short-circuit_evaluation

  <% @camping.situations.each do |situation| %>
    <%if situation.plage == "oui" || situation.etang == "oui" || situation.lac == "oui" %>
    Do that
    <%else%>
    Do this
    <%end%>
<%end%>

我的应用程序测试超过30个条件,所以我不想重复使用多个IF。

示例: Plage = oui / etang = Non / lac = oui 我想在我看来显示:

Do that
Do this
Do that

你有什么建议吗?

修改

对不起,我认为我的信息不明确。因此,对于每个条目,我有3个可能的值1)OUI 2)NON 3)EMPTY。用户添加其对象的值。

所以在我看来,我这样显示

<% @camping.caracteristiquetests.each do |caracteristiquetest| %>
          <%if caracteristiquetest.animaux =="oui"%>animaux<%else%><s>animaux</s><%end%>
      <%if caracteristiquetest.barbecue=="oui"%>barbecue<%else%><s>barbecue</s><%end%>
      <%if caracteristiquetest.handicap =="oui"%>handicap<%else%><s>handicap</s><%end%>
      <%if caracteristiquetest.piscine=="oui"%>piscine<%else%><s>piscine</s><%end%>
      <%if caracteristiquetest.jeux =="oui"%>jeux<%else%><s>jeux</s><%end%>
      <%if caracteristiquetest.loisir=="oui"%>loisir<%else%><s>loisir</s><%end%>

    <%end%>
    <!--Affiche les parametres de la table situation-->
    <% @camping.situations.each do |situation| %>
      <%if situation.plage =="oui"%>plage<%else%><s>plage</s><%end%>
      <%if situation.etang =="oui"%>etang<%else%><s>etang</s><%end%>
      <%if situation.montagne =="oui"%>montagne<%else%><s>montagne</s><%end%>
      <%if situation.riviere =="oui"%>riviere<%else%><s>riviere</s><%end%>
      <%if situation.foret=="oui"%>foret<%else%><s>foret</s><%end%>
    <%end%>

如果价值与“oui”不同,我的观点会显示Strikethrough。

我有更多的条目,但它始终是相同的条件。如你所见,我有很多“IF”。所以我只想知道是否可以干这个?

1 个答案:

答案 0 :(得分:1)

你可以这样做。 代码situation.members.any?{|m| situation.send(m) == 'oui'}枚举您的情境对象的成员(属性),并通过对字符串'oui'发送成员名来比较它们的值,如果其中任何一个包含它,则整个表达式为真。 三元声明?对此进行评估并将“Do that”设置为true,并将“Do this”设置为其他。

situation = Struct.new(:plage, :etang, :lac)
situations = []
situations << situation.new('non','oui','non')
situations << situation.new('non','non','non')

situations.each do |situation| 
  puts situation.members.any?{|m| situation.send(m) == 'oui'} ? "Do that" : "Do this"
end

# gives
# Do that
# Do this

如果我理解你的上一次编辑是正确的,那么这将成为

situations.each do |situation| 
  situation.members.each{|member| puts situation.send(member) == 'oui' ? "Do that" : "Do this"}
end

下次你真的应该让你的问题更加清晰。 根据您上一次编辑,我的最后一次尝试,您只需要更深入一级。 我们只是给你如何做某事的方法,剩下的由你决定。 比这更干燥它不会变成..

camping = Struct.new(:situation, :caracteristiquetest)
campings = []

situation           = Struct.new(:plage, :etang, :lac, :montagne, :riviere, :foret)
caracteristiquetest = Struct.new(:animaux, :barbecue, :handicap, :piscine, :jeux, :loisir)

campings << 
  camping.new(situation.new('non','oui','non','non','oui','non'),
  caracteristiquetest.new('non','oui','non','non','oui','non'))

campings << 
  camping.new(situation.new('oui','oui','non','non','oui','non'),
  caracteristiquetest.new('non','oui','non','non','non','non'))

campings.each do |camping|
  camping.members.each do |camping_attr| 
    camping.send(camping_attr).members.each{|member| 
      puts camping.send(camping_attr).send(member) == 'oui' ? member : "<s>#{member}</s>"
    }
  end
end

哪个给出了

<s>plage</s>
etang
<s>lac</s>
<s>montagne</s>
riviere
<s>foret</s>
<s>animaux</s>
barbecue
<s>handicap</s>
<s>piscine</s>
jeux
<s>loisir</s>
plage
etang
<s>lac</s>
<s>montagne</s>
riviere
<s>foret</s>
<s>animaux</s>
barbecue
<s>handicap</s>
<s>piscine</s>
<s>jeux</s>
<s>loisir</s>