簡體   English   中英

將分頁,嵌套路線,紅寶石,鐵軌

[英]will paginate, nested routes, ruby, rails

我正在嘗試將分頁鏈接到我的嵌套路由,而不是常規的post變量。 我知道我應該通過一些參數進行分頁,但是我不知道如何通過它們。

基本上,有一個數組存儲在@posts ,另一個分頁可以訪問的參數是category_id

嵌套的路由是/category/1/posts但點擊下一個和上一個將進行分頁,返回的URL類似於此posts?page=1&category_id=7

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

這是Yannis回答的結果:

在您的控制器中,您可以執行以下操作:

@posts = @category.posts.paginate

在您看來:

<%= will_paginate(@post) %>

為此,請使用以下網址

posts?page=2&post_category_id=athlete_management

route.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 

必須在塊之后聲明資源

謝謝斯蒂芬!

在這個舊問題上跳傘是因為我遇到了同樣的問題。

我遇到了幾乎完全相同的問題。 我聽從了響應者的建議,這條路線上有些時髦。 我研究了路線,發現(翻譯成適合您的情況):

resources :posts
resources :categories do
  resources :posts
end

這樣可以使category_posts_path調用返回(按預期方式) /category/1/posts

但是,認識到will_paginate調用類似於url_for東西是至關重要的, url_for從路由“向后”工作以找到與參數匹配的第一條路由。

由於resources :posts出現在嵌套路由的上方,因此可以看到滿足條件,只插入category_id=1是一個查詢字符串。

它對其他所有人“開箱即用”的原因是,因為他們沒有將嵌套資源單獨列出為獨立資源。

刪除它,你應該沒事!

在您的控制器中,您可以執行以下操作:

@posts = @category.posts.paginate

在您看來:

<%= will_paginate(@post) %>

好的,因此從問題中無法確切得知,但我假設您正在嘗試從/posts類的根目錄URL進入/category/1/posts特定類別的頁面。

我之所以認為這是因為我有嵌套的路由(甚至在名稱空間中),其中will_paginate可以正常工作而沒有任何特殊參數。 如果不是這種情況,那么您的路線可能還有其他時髦的事情,因此需要更多信息來進行調試。

但是我至少可以解釋will_paginate的工作原理。 生成頁面URL時,它將使用現有參數加上所需的特定頁面調用url_for 因此,如果您已經設置了一堆參數,它應該保留它們,包括那些屬於路徑本身的參數。 幸運的是,它還允許您將其他參數與(surprise!) :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 請記住,路線定義順序很重要,可能會造成沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM