Ajax的分页就像twitter和kaminari一样

时间:2014-01-07 10:22:36

标签: ruby-on-rails ruby-on-rails-3 pagination kaminari

现在我正在尝试使用kaminari设置像twitter这样的ajax分页。

我收到了错误消息,我不知道如何解决这个问题。 我该怎么做才能让它发挥作用?

☆错误信息

NoMethodError at /members
undefined method `last_page?' for nil:NilClass

☆member.rb

  default_scope :order => 'created_at DESC'
  paginates_per 10

☆members_controller

  def index
       if params[:name].present?
           @members = Member.where("name like ?" , "%" + params[:name] + "%")
           @members = @members.order('created_at DESC').page(params[:page])
          else
            @members = Member.order('created_at DESC').page(params[:page])
          end
  end

☆index.html.erb

<h1>Listing users</h1>
<p>※登録されているユーザーのリストです。</p>

      <div class= "form_index">
        <%= form_tag({:action=>"index"}, {:method=>"get"}) do %>
         <div class="from_field_index">
          <%= text_field_tag 'name' %>
         <%= submit_tag '名前検索' %>
        <% end %>
        </div>
      </div>

<div id="lists">
   <%= render 'index' %>
</div>  

<%= link_to_next_page(@hoges, 'more', remote: true, id: 'view_more') %>

☆_index.html.erb

<table class="table">
  <tr>
    <th>写真</th>
    <th>名前</th>
    <th>分野</th>
    <th>場所</th>
    <th>経験</th>
     <th>Follow</th>
    <%# if Member.find(session[:user_id]).admin %>
    <%# end %>
  </tr>
<% @members.each do |member| %>
  <tr>
    <td>
     <% if member.provider %>
        <%=image_tag member.image ,:size=>'30x30'%>
     <% elsif member.avatar_file_name %> 
        <%= image_tag member.avatar.url(:thumb), :width =>'30px', :height =>'30px' %>
     <% else %> 
        <%= image_tag "love.png", :size=>'30x30'  %>  
     <% end %>
    </td>
    <td>
      <a href="/members/<%= member.id %>"><%= member.name %></a>
       <% if member.provider == "facebook" %>
           <a target="_blank" href="http://www.facebook.com/<%=member.uid %>"> <%=image_tag "fb.png" ,:size=>'20x20'%>  </a>
        <% elsif member.provider == "twitter" %>
           <a target="_blank" href="http://www.twitter.com/<%=member.name %>"> <%=image_tag "twitter.png" ,:size=>'20x20'%>  </a>
       <% end %>
    </td>

    <td><%= member.field %></td>
    <td>
         <% if member.url.present? %>
           <%=link_to member.place ,member.url ,:target=>["_blank"] %> 
         <% else %>
          <%= member.place %>
        <% end %>  
      </td>
      <td><%= member.experience %></td>
      <td>
        <div class="onoff">
            <% unless session[:user_id] == member.id %>    
                 <% if @Frids.include? member.id%>
                  <%= link_to'解除', {:controller => 'members', :action => 'index', :id =>
                  member.id}, class: "btn btn-midium btn-warning"%><br/>
                <% else %>
                   <%= link_to'follow', {:controller => 'members', :action => 'index', :id =>
                  member.id}, class: "btn btn-midium btn-primary"%><br/>
               <% end %>
             <% end %>  
         </div>
      <%#= member.friends.count %>
    </td>

     <% if Member.find(session[:user_id]).admin %>
         <td><%= link_to 'Destroy', member, method: :delete, data: { confirm: 'Are you sure?' } %></td>
     <% end %>

  </tr>
<% end %>
</table>

☆index.js.erb的

$("#view_more").replaceWith("<%= escape_javascript(
    link_to_next_page(@members, 'more', remote: true, id: 'view_more')
) %>");

☆members_helper.rb

module MembersHelper

def link_to_next_page(scope, name, options = {}, &block)
  param_name = options.delete(:param_name) || Kaminari.config.param_name
  link_to_unless scope.last_page?, name, {param_name => (scope.current_page + 1)}, options.merge(:rel => 'next') do
    block.call if block
  end
end

end

1 个答案:

答案 0 :(得分:0)

该错误告诉您在“MembersHelper”模块中,您调用last_page?对象上的nil方法:参数scope的值。由于scopelink_to_next_page方法的必需参数,因此表示您使用第一个参数等于nil来调用此方法。

因此,您的控制器为@members分配了一个零值。

尝试用这个替换你的索引方法,并查看你的日志中的值,你会发现错误是否来自params的错误值!

def index
       if params[:name].present?
           @members = Member.where("name like ?" , "%" + params[:name] + "%")
           @members = @members.order('created_at DESC').page(params[:page])
          else
            @members = Member.order('created_at DESC').page(params[:page])
          end
       p params[:page]
       p params[:name]
       p @members
  end