内容在循环中重复

时间:2013-12-27 17:29:00

标签: html css ruby-on-rails ruby

出于某种原因,下面的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 %>

1 个答案:

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