2012-06-26 33 views
30

Tôi đã tìm kiếm và tìm kiếm, nhưng không có gì giải quyết được vấn đề của tôi. Đây là bộ điều khiển của tôi:Kaminari & Rails pagination - phương pháp chưa xác định `current_page '

def show 
    @topic = Topic.find(params[:id]) 
    @topic.posts = @topic.posts.page(params[:page]).per(2) # 2 for debugging 
end 

Điều đó chỉ hoạt động tốt, vì chế độ xem chủ đề được giảm xuống thành hai bài đăng. Tuy nhiên, khi tôi thêm video này vào show.html.erb:

<%= paginate @topic.posts %> 

Tôi cho lỗi này:

undefined method `current_page' for #<ActiveRecord::Relation:0x69041c9b2d58> 

Trả lời

45

Hãy thử với:

def show 
    @topic = Topic.find(params[:id]) 
    @posts = @topic.posts.page(params[:page]).per(2) 
end 

Và sau đó:

<%= paginate @posts %> 
+0

Đó đã nhận nó, tôi cảm thấy ngớ ngẩn bây giờ. Cảm ơn! – time

2

Cách đây một thời gian, tôi gặp phải một chút vấn đề với kaminari mà tôi đã giải quyết bằng cách sử dụng các tên biến khác nhau cho mỗi hành động.

Hãy nói rằng trong hành động index bạn gọi cái gì đó như:

def index 
    @topic = Topic.all.page(params[:page]) 
end 

Các index xem hoạt động tốt với <%= paginate @topic %> tuy nhiên nếu bạn muốn sử dụng tên biến tương tự ở bất kỳ hành động khác, nó throu một lỗi như thế .

def list 
    # don't use @topic again. choose any other variable name here 
    @topic_list = Topic.where(...).page(params[:page]) 
end 

Điều này phù hợp với tôi.

Xin vui lòng, chụp.

+0

(Tôi biết nó cũ) Bất kỳ ý tưởng về lý do tại sao điều này có thể xảy ra? –

20

Nếu bạn nhận được lỗi pagination trong Kaminari như

undefined method `total_pages'

hoặc

undefined method `current_page'

có khả năng bởi vì phạm vi AR bạn đã vượt qua thành paginate đã không có phương pháp page gọi vào nó.

Đảm bảo bạn luôn gọi page trên phạm vi bạn sẽ chuyển đến paginate!

này cũng đúng nếu bạn có một mảng mà bạn đã được trang trí bằng Kaminari.paginate_array

Xấu:

<% scope = Article.all # You forgot to call page :( %> 
<%= paginate(scope)  # Undefined methods...  %> 

Tốt:

<% scope = Article.all.page(params[:page]) %> 
<%= paginate(scope) %> 

Hoặc với một mảng không AR của bạn của riêng ...

Xấu:

<% data = Kaminari.paginate_array(my_array) # You forgot to call page :(  %> 
<%= paginate(data)       # Undefined methods...  %> 

Một lần nữa, điều này là tốt:

<% data = Kaminari.paginate_array(my_array).page(params[:page]) %> 
<%= paginate(data) %> 
Các vấn đề liên quan