Ответ 1
Попробуйте:
def show
@topic = Topic.find(params[:id])
@posts = @topic.posts.page(params[:page]).per(2)
end
И затем:
<%= paginate @posts %>
Я искал и искал, но ничто не решило мою проблему. Здесь мой контроллер:
def show
@topic = Topic.find(params[:id])
@topic.posts = @topic.posts.page(params[:page]).per(2) # 2 for debugging
end
Это работает отлично, потому что представление темы сводится к двум сообщениям. Однако, когда я добавляю это в show.html.erb:
<%= paginate @topic.posts %>
Мне дана эта ошибка:
undefined method `current_page' for #<ActiveRecord::Relation:0x69041c9b2d58>
Попробуйте:
def show
@topic = Topic.find(params[:id])
@posts = @topic.posts.page(params[:page]).per(2)
end
И затем:
<%= paginate @posts %>
Если вы получаете ошибки разбивки на страницы в Каминари, например
undefined метод `total_pages '
или
undefined метод `current_page '
вероятно, из-за того, что область AR, с которой вы перешли в paginate
, не вызывала на ней метод page
.
Убедитесь, что вы всегда вызываете page
в областях, через которые вы будете проходить, в paginate
!
Это также имеет место, если у вас есть массив, который вы украсили, используя Kaminari.paginate_array
Плохо:
<% scope = Article.all # You forgot to call page :( %>
<%= paginate(scope) # Undefined methods... %>
Хорошо:
<% scope = Article.all.page(params[:page]) %>
<%= paginate(scope) %>
Или с массивом не-AR вашего собственного...
Плохо:
<% data = Kaminari.paginate_array(my_array) # You forgot to call page :( %>
<%= paginate(data) # Undefined methods... %>
Опять же, это хорошо:
<% data = Kaminari.paginate_array(my_array).page(params[:page]) %>
<%= paginate(data) %>
Некоторое время назад у меня была небольшая проблема с каминари, которую я решил, используя разные имена переменных для каждого действия.
Скажем, в действии index
вы вызываете что-то вроде:
def index
@topic = Topic.all.page(params[:page])
end
В представлении index
отлично работает с <%= paginate @topic %>
, однако, если вы хотите использовать одно и то же имя переменной в любом другом действии, оно вызывает такую ошибку.
def list
# don't use @topic again. choose any other variable name here
@topic_list = Topic.where(...).page(params[:page])
end
Это сработало для меня.
Пожалуйста, сделайте снимок.