出于某种原因,下面else语句中的tweets是重复的,我不明白为什么。
如果tweets包含这个短语,他们将收到修订的div。如果tweets不包含这个短语,他们应该有常规文本。然而,如果tweets中没有包含这个短语,那么这些tweets出于某种原因会出现两次。
这与环路的设置方式有关吗?

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

最佳答案

每个blockedshow中的每个已编辑短语执行一次内部循环,这将复制每个短语的tweet输出。尝试使用any?一次对照所有短语检查tweet,并根据该结果发出正确的<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 %>

关于html - 内容循环复制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20805040/

10-13 07:29