现在我正在尝试使用 kaminari 设置像 Twitter 一样的 ajax 分页。
我收到一条错误消息,我不知道如何解决这个问题。我应该怎么做才能让它工作?
☆错误信息
NoMethodError at /members
undefined method `last_page?' for nil:NilClass
☆会员.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
☆索引.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>
☆索引.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
错误告诉您在"MembersHelper"模块中,在nil
对象上调用last_page?
方法:参数的值scope
。由于scope
是link_to_next_page
方法的强制参数,这意味着您在调用此方法时,其第一个参数等于 nil
。
因此,控制器将 nil 值分配给@members。
尝试用这个替换你的索引方法,并在你的日志中查看值,你会发现错误是否来自参数的错误值!
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