#ruby-on-rails #ruby #conditional-statements #dry
#ruby-on-rails #ruby #условные операторы #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) НЕ 3) ПУСТОЙ. Пользователь добавляет значение своего объекта.
Итак, на мой взгляд, я отображаю так
<% @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», мое представление отображается зачеркнутым.
У меня больше записей, но это всегда одно и то же условие. Как вы можете видеть, у меня много «ЕСЛИ». Итак, я просто хочу знать, возможно ли это ВЫСУШИТЬ?
Комментарии:
1. Я не совсем понимаю, о чем вы спрашиваете. У вас есть тридцать условий вида
situation.foo == "oui"
, гдеfoo
находится атрибут?2. Я отредактировал свой ответ. Извините за объяснение. Это лучше?
3. Ваш вопрос все еще запутанно неполон… Вы говорите, что существует «30 условий», но вы перечислили только три. Все ли остальные условия очень просты? Вы также изначально подразумевали, что один атрибут должен быть равен «oui», а теперь в своем редактировании вы включили «non» — не могли бы вы уточнить, какую именно проблему вы решаете?
4. Я тоже не понимаю, даже после редактирования. Пожалуйста, приведите конкретный полный пример, чтобы людям не нужно было догадываться.
5. Могу ли я предложить вам использовать
true
andfalse
вместо"oui"
and"non"
? Вы просто усложняете себе задачу 😉 Например,situation.plage? == true
Или, в качестве альтернативы, может быть, просто использоватьsituation == "plage"
? Что означает «Сделай это; Сделай это; Сделай это»? — Я думал, что в вашем состоянии было только 2 ветки, но теперь вы упомянули 3… Или, может быть, на самом деле их 30 ?! Как я уже сказал выше, пожалуйста, уточните свой вопрос; на данный момент нам нужно будет угадать , чего вы хотите достичь.
Ответ №1:
Вы могли бы сделать это следующим образом. Код situation.members.any?{|m| situation.send(m) == 'oui'}
перечисляет элементы (атрибуты) вашего объекта situation и сравнивает их значение для каждого, выполняя отправку имени члена со строкой ‘oui’, если какой-либо из них содержит его, все выражение истинно. Троичный оператор? оценивает это и ставит «Сделай это», если true, и «Сделай это» еще.
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>
Комментарии:
1. Спасибо за ваш ответ 🙂 К сожалению, это не совсем то, чего я хочу. Я отредактировал свой ответ.
2. Это не совсем так. Я сожалею, что мой ответ не был ясен. Я отредактировал. Спасибо за вашу помощь