0

Now I am trying to set up ajax pagination like twitter with kaminari.

I got an error message and I have no idea how to solve this. What should I do to make it work?

☆error message

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
Kuniharu Aramaki
  • 371
  • 1
  • 3
  • 14

1 Answers1

0

The error tells you that in your "MembersHelper" module, you call the last_page? method on the nil object : the value of your argument scope. And since scope is a mandatory argument of your link_to_next_page method, it means that you call this method with its first argument equal to nil.

So, your controller assign a nil value to @members.

Try to replace your index method by this one, and have a look in your logs to the values, and you will find if the error comes from a bad value of 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
Jean-Théo
  • 402
  • 3
  • 13
  • Thank you. I replaced "@hoges" with "@members" at index.html.erb. But still I got the same error.. – Kuniharu Aramaki Jan 07 '14 at 13:10
  • Thank you very much, here is the result.[1] pry(#)> params[:page] => nil [2] pry(#)> params[:name] => nil [3] pry(#)> @members => [#] – Kuniharu Aramaki Jan 08 '14 at 00:54
  • That's odd : the `@members` variable does not seem to be nil at the time that your controller sends it to the view.. Are you sure you do not call the `link_to_next_page` method elsewhere ? Could we see the full backtrace of your `NoMethodError` ? – Jean-Théo Jan 08 '14 at 09:49