出于某种原因,下面的else语句中的推文是重复的,我无法弄清楚原因。
如果推文包含该短语,则会收到编辑的div。如果推文不包含该短语,则应该包含常规文本。但是,如果推文不包含该短语,那些推文出于某种原因会出现两次。
这是否与设置循环的方式有关?
<section id="tweets">
<ul>
<% tweet = @tweets.each do |tweet| %>
@<%= tweet.user.screen_name %>
<%= image_tag(tweet.user.profile_image_url) %>
<% current_user.blockedshows.each do |blockedshow| %>
<% blockedshow.phrases.each do |phrase| %> </br>
<% if tweet.text.include?(phrase.text)%>
<li><%= link_to check_if_redacted(tweet.text), "https://www.twitter.com/#{tweet.user.screen_name}" %></li>
<% else %>
<li><%= link_to tweet.text, "https://www.twitter.com/#{tweet.user.screen_name}" %></li>
<% end %>
<% end %>
<% end %>
答案 0 :(得分:1)
内部循环对每个blockedshow
内的每个编辑短语执行一次,这将复制每个短语的推文输出。尝试使用any?
一次检查所有短语的推文,并根据该结果发出正确的<div>
:
<% if current_user.blockedshows.flat_map(&:phrases).flatten.any? { |phrase| tweet.text.include? phrase.text } %>
<!-- Tweet contains at least one blocked phrase. -->
<li><%= link_to check_if_redacted(tweet.text), "https://www.twitter.com/#{tweet.user.screen_name}" %></li>
<% else %>
<!-- Tweet contains no blocked phrases. -->
<li><%= link_to tweet.text, "https://www.twitter.com/#{tweet.user.screen_name}" %></li>
<% end %>
该测试变得有点混乱,因此这是重构为辅助方法的功能的良好候选者。在这个视图的帮助器中:
def is_redacted? tweet
@phrases ||= current_user.blockedshows.map(&:phrases).flatten.map(&:text)
@phrases.any? { |phrase| tweet.text.include? phrase }
end
然后更改视图中的if
:
<% if is_redacted? tweet %>