Ruby on Rails - Paginating Comments

时间:2013-04-23 08:24:44

标签: ruby-on-rails comments

我创建了一个应用程序,用户可以在其中创建项目并对这些项目进行评论。现在,我有能力让用户在每个项目页面上发表评论。

问题:根据我下面的代码,我能使用will_paginate吗?我确实安装了gem,所以,如果是这样,我将如何将它集成到我的代码中?如果没有,我需要做什么来建立分页?

comment.rb

class Comment < ActiveRecord::Base
  attr_accessible :content, :project_id, :user_id
  validates :content, presence: true

  belongs_to :project
  belongs_to :user

  scope :newest, order("created_at desc")
end

comments_controller.rb

class CommentsController < ApplicationController
  before_filter :authenticate_user! 

  def create
    project = Project.find(params[:project_id])
    @comment = project.comments.create!(params[:comment])
    redirect_to project_path(project)
  end
end

项目/ show.html.erb

        <!-- Add Comments -->

          <% if signed_in? %>
            <p class="comment_header">Add Comment:</p>

            <span class="comment">
                <%= form_for([@project, @project.comments.build]) do |f| %>
                  <div class="field">
                    <%= f.text_area :content, :class => "span7", :rows => "3" %>
                  </div>

                  <%= f.hidden_field :user_id, :value => current_user.id %>

                  <div class="actions">
                    <%= f.submit "Add Comment", :class => "btn btn-header" %>
                  </div>
                <% end %>
            </span>

          <% else %>

            <p class="comment_header"><%= link_to 'Sign in', new_user_session_path %> to post comments.</p> 

          <% end %>

          <!-- Show Comments -->
          <p class="comment_header">Comments:</p>

          <% if @project.comments.blank? %>     
            <p>No comments made yet for this project.</p>        
          <% else %>        
            <% @project.comments.newest.each do |comment| %>   
              <div class="comments">        
                <p><%= comment.content %></p>
                <span>By <%= link_to comment.user.name, comment.user %> <%= time_ago_in_words(comment.created_at) %> ago</span>
              </div>
            <% end %>       
          <% end %>
          <!-- end of comments section -->

4 个答案:

答案 0 :(得分:2)

是的,您可以使用will_paginate gem。此gem仅用于获取具有页码的行数,您可以指定每页的元素数。 例如,第1页将为您提供1到30个元素 第2页31至60 .... 必须实现视图后

答案 1 :(得分:0)

您可以毫无问题地使用will_paginate。您还可以查看更灵活的kaminari

答案 2 :(得分:0)

您可以在重定向

之前调用paginate方法

在您的控制器中

  @comments = @project.comments.pagenate(page: params[:page]||1,per_page: 20)

并将以下内容添加到模板

  <%= will_paginate @comments %>

答案 3 :(得分:0)

您尚未正确实施will_paginate。 (You can read about proper implementation in the documentation here.

简而言之,您需要在控制器中使用类似@comments = @project.comments.paginate(page: params[:page])的内容来执行索引操作,然后迭代@comments。然后执行will_paginate @comments应该正常工作。

您不能在视图中执行查询(will_paginate @user.comments.newest),因为paginate方法返回一个处理分页的特殊对象,与普通的ActiveRecord查询不同。