будут разбиты на страницы, вложенные маршруты, рубины, рельсы - PullRequest
1 голос
/ 23 октября 2010

Я пытаюсь получить ссылку на мой вложенный маршрут вместо обычной переменной posts.Я знаю, что я должен передать некоторые параметры для разбивки на страницы, но я не знаю, как их передать.

По сути, существует массив, хранящийся в @posts, и другой параметр для пагинации имеет доступ к category_id.

Вложенный маршрут - /category/1/posts, но при нажатии на следующий и предыдущий вызов paginate возвращает URL-адрес, подобный этому posts?page=1&category_id=7.

 <%= will_paginate @most_recent_posts "What do I do here?" %>

Это результат Яннисаответ:

В вашем контроллере вы можете сделать:

@posts = @category.posts.paginate

И на ваш взгляд:

<%= will_paginate(@post) %>

Для этого появится следующий URL

posts?page=2&post_category_id=athlete_management

rout.rb # есть больше маршрутов, но это соответствующие

map.resources :posts
map.resources :post_categories, :has_many => :posts

решение

 map.resources :post_categories do |post_category|
   post_category.resources :posts
  end
  map.resources :posts 

Пришлось объявлять ресурс после блока

Спасибо, Стивен!

Ответы [ 3 ]

3 голосов
/ 05 января 2011

Прыжки с парашютом здесь на этот старый вопрос, потому что я столкнулся с той же проблемой.

У меня была точно такая же проблема. Я последовал совету ответчиков, что с маршрутами происходило что-то необычное. Я порылся в маршрутах и ​​нашел (переведено в соответствии с вашей ситуацией):

resources :posts
resources :categories do
  resources :posts
end

Это сделало так, что вызов category_posts_path вернул (как и ожидалось) /category/1/posts.

Тем не менее, важно понять, что will_paginate вызывает нечто, похожее на url_for, которое работает "назад" от маршрутов, чтобы найти первый маршрут, который соответствует параметрам.

Поскольку resources :posts появляется над вложенным маршрутом, он видит, что он удовлетворяет требованиям, и просто вставляет category_id=1 в качестве строки запроса.

Причина, по которой он работал "из коробки" для всех остальных, заключалась в том, что у них не было вложенного ресурса, отдельно указанного в качестве автономного ресурса.

Удалите это, и все будет в порядке!

1 голос
/ 27 октября 2010

Хорошо, так что это не совсем ясно из вопроса, но я предполагаю, что вы пытаетесь перейти с URL-адреса корневого уровня, например /posts, на страницы для определенных категорий, таких как /category/1/posts.

.

Причина, по которой я предполагаю, что это потому, что у меня есть вложенные маршруты (даже в пространстве имен), где will_paginate прекрасно работает без каких-либо специальных параметров. Если это не так, то, вероятно, что-то еще происходит с вашими маршрутами, и для отладки потребуется больше информации.

Однако я могу хотя бы объяснить, как работает will_paginate. Когда он генерирует URL-адреса страницы, он вызывает url_for с существующими параметрами и конкретной необходимой страницей. Поэтому, если у вас уже есть набор параметров, он должен сохранить их, включая те, которые являются частью самого пути. К счастью, он также позволяет передавать дополнительные параметры для объединения с параметром (сюрприз!) :params в will_paginate.

Теперь, если вы правильно настроили вложенные маршруты, /category/1/posts можно сгенерировать:

url_for(:controller => 'posts', 
        :category_id => '1')

Но если вы находитесь на странице /posts, то параметры будут только:

{:controller => 'posts'}

Так что вам нужно передать category_id в will_paginate следующим образом:

<%= will_paginate @posts, :params => {:category_id => @posts.first.category_id} %>

Если это не сработает, то я подозреваю, что с вашими маршрутами что-то не так. Попробуйте добавить в шаблон оператор отладки и вызвать url_for с разными перестановками параметров. Помните, что порядок определения маршрута имеет значение и может создавать конфликты.

1 голос
/ 24 октября 2010

В вашем контроллере вы можете сделать:

@posts = @category.posts.paginate

А по вашему мнению:

<%= will_paginate(@post) %>
...