加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails渲染部分两次

发布时间:2020-12-17 01:35:17 所属栏目:百科 来源:网络整理
导读:Rails输出我的文章两次.目前,我只是循环文章集合并输出它.起初我认为它是 AJAX的一个问题,但我删除了application.js和index.js.erb文件中的所有 javascript,它仍然重复两次.我还通过登录Rails c并运行Articles.all.count来检查数据库,并返回正确的文章数.我
Rails输出我的文章两次.目前,我只是循环文章集合并输出它.起初我认为它是 AJAX的一个问题,但我删除了application.js和index.js.erb文件中的所有 javascript,它仍然重复两次.我还通过登录Rails c并运行Articles.all.count来检查数据库,并返回正确的文章数.我也重置了数据库并再次尝试使用相同的结果.

文章#指数

<h1 class="text-center">talks</h1>

<div id="articles-list" class="small-12 small-centered columns">
  <%= render @articles %>
</div>  

<%= will_paginate @articles %>

_article.html.erb partial:

<% @articles.each_with_index do |article,index| %>
<%= index %>
<dl class="individual-article">
    <dt><%= article.title %> 
    <% if current_user.try(:admin) %>
        | <%= link_to 'Edit',edit_article_path(article) %>
    <% end %><br> 
    <%= raw article.tags.map(&:name).map { |t| link_to t,tag_path(t),class: get_class(t) }.join(',') %>
    </dt>
    <dd><%= truncate(article.body.html_safe,length: 200) %>
        <%= link_to 'more',article_path(article) %>
    </dd>
</dl>

我把索引打开,如果它正在重复,它就是.如果我有三篇文章,它将输出0 1 2 0 1 2作为indeces.所以我知道它会被执行两次.

物品管理员

def index
    if params[:tag]
        @articles = Article.tagged_with(params[:tag]).order('created_at DESC').paginate(page: params[:page],per_page: 3)
    else 
        @articles = Article.order('created_at DESC').paginate(page: params[:page],per_page: 3)
    end
end

我有一些AJAX用于无限滚动,这可能是问题所在.除非我删除整个js文件,否则它具有相同的行为.

index.js.erb的

$('#articles-list').append('<%= escape_javascript render(@articles) %>');
$('.pagination').replaceWith('<%= escape_javascript will_paginate(@articles) %>');

的application.js

$(document).ready(function() {
  if ($('.pagination').length) {
    $(window).scroll(function() {
      var url = $('.pagination .next_page').attr('href');
      if (url && $(window).scrollTop() > $(document).height() - $(window).height() - 50) {
        $('.pagination').text("Please Wait...");
        return $.getScript(url);
      }
    });
    return $(window).scroll();

  }
});

我对Rails相对较新,并希望了解如何防止这种情况两次执行.

编辑

部分服务器日志:

...
Article Load (0.2ms)  SELECT  "articles".* FROM "articles"  ORDER BY created_at DESC LIMIT 3 OFFSET 0
...
Rendered articles/_article.html.erb (6.5ms)
Rendered articles/index.html.erb within layouts/application (12.8ms)
Rendered layouts/_header.html.erb (0.4ms)

解决方法

您正在将集合传递给partial.这将为@articles中的每个元素渲染部分时间.
在部分中,然后再次在@articles上循环.
如果您不需要索引,请将该循环置于partial之外或删除它.
这些都有效:

文章#指数

<div id="articles-list" class="small-12 small-centered columns">
  <% @articles.each_with_index do |article,index| %>  
     <%= render 'article',article: article,index: index %>
  <%end%>
</div>

_article.html.erb partial:

<%= index %>
<dl class="individual-article">
  <dt><%= article.title %> 
    <% if current_user.try(:admin) %>
      | <%= link_to 'Edit',') %>
  </dt>
  <dd><%= truncate(article.body.html_safe,length: 200) %>
    <%= link_to 'more',article_path(article) %>
  </dd>
</dl>

或者如果你不需要partial中的索引,请保持index.html,就像现在一样,只需从partial中删除循环:

_article.html.erb partial:

<dl class="individual-article">
  <dt><%= article.title %> 
    <% if current_user.try(:admin) %>
      | <%= link_to 'Edit',edit_article_path(article) %>
   <% end %><br> 
   <%= raw article.tags.map(&:name).map { |t| link_to t,article_path(article) %>
  </dd>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读