在railscast 114之后实现'Endless Page'Javascript

时间:2011-10-18 05:46:50

标签: javascript ruby-on-rails pagination

我有一个简单的Twitter模型设置跟随rails教程,我试图在此之后添加Endless Page:http://railscasts.com/episodes/114-endless-page

Ryan使用了产品页面和索引。但是,我有新闻消息,因此需要更换某些变量。

我用@feed_items替换了@products,但没有运气。实现起来似乎很简单,所以我不确定我做错了什么。

代码比较:

这是我的页面控制器,它将是Ryan的产品控制器

class PagesController < ApplicationController

  def home
    @title = "Home"
    if signed_in?
      @micropost = Micropost.new
      @feed_items = current_user.feed.paginate(:page => params[:page])
    end
  end

Ryan的代码:

def index
  @products = Product.paginate(:page => params[:page], :per_page => 15)
end

我的index.js.rjs(问题可能在这里?)

page.insert_html :bottom, :feed_item, :partial => @feed_items
if @feed_items.total_pages > @feed_items.current_page
  page.call 'checkScroll'
else
  page[:loading].hide
end

Ryan的代码

page.insert_html :bottom, :products, :partial => @products
if @products.total_pages > @products.current_page
   page.call 'checkScroll'
else
   page[:loading].hide
end

Application_helper.rb(与Ryan相同)

def javascript(*args)
  content_for(:head) { javascript_include_tag(*args) }
end

_feed.html.erb

<% unless @feed_items.empty? %>
<% javascript :defaults, 'endless_page' %>
  <table class="microposts" summary="User microposts">
    <%= render :partial => 'shared/feed_item', :collection => @feed_items %>
  </table>
<% end %>
<p id="loading">Loading more page results...</p>

Ryan的index.html.erb

<% title "Products" %>
<% javascript :defaults, 'endless_page' %>

<div id="products">
  <%= render :partial => @products %>
</div>
<p id="loading">Loading more page results...</p>

endless_page.js [与Ryan相同](问题可能在于这里引用了/products.js行。我尝试改为feed.js但没有运气)。

var currentPage = 1;

function checkScroll() {
  if (nearBottomOfPage()) {
    currentPage++;
    new Ajax.Request('/products.js?page=' + currentPage, {asynchronous:true, evalScripts:true, method:'get'});
  } else {
    setTimeout("checkScroll()", 250);
  }
}

function nearBottomOfPage() {
  return scrollDistanceFromBottom() < 150;
}

function scrollDistanceFromBottom(argument) {
  return pageHeight() - (window.pageYOffset + self.innerHeight);
}

function pageHeight() {
  return Math.max(document.body.scrollHeight, document.body.offsetHeight);
}

document.observe('dom:loaded', checkScroll);

1 个答案:

答案 0 :(得分:2)

我对rails非常陌生并尝试做类似的事情。但是你的GET请求肯定需要转到你的控制器而不是教程中的控制器。也许你需要在你的控制器中使用.js格式的渲染?

我认为我们会选择使用jquery,但我今天也会尝试这个,如果发现任何内容,我会更新。

---更新。我试过这个,它工作得很好。我认为该教程将路由设置为资源。多数民众赞成在你被困的地方。希望对你有效。