params[:page] 在 will_paginate 中结转

params[:page] carry-over in will_paginate

在我们的应用程序中,有一个 purchase orders 的列表,其中有 order items。两个列表都使用 will_paginate。这是 purchase orders:

的代码
@orders = @orders.page(params[:page]).per_page(30)

这是 order items 的代码:

@order_items = @order_items.page(params[:page]).per_page(30)

如代码所示,他们都在 params[:page] 开始回复。问题是当用户打开 purchase orders 的第 2 页时,params[:page] 被设置为 2。然后 order items 列表将从 params[:page] = 2 开始,而不是第 1 页。这会导致 order items 的第 1 页未列出。 params[:page] 结转引起的这个问题有什么好办法解决吗?

我们通过以下代码(在 before_action 中)为每个控制器记住参数 [:page] 解决了这个问题

def page_params
  key_sym = ('page_' + params[:controller].sub('/', '_')).to_sym
  if params[:page] then
    session[key_sym] = params[:page]
  elsif session[:key_sym]
    params[:page] = session[:key_sym]
  end 
end

上述解决方案的潜在问题是我们无法重置 session[key_sym],它可能会在下一个 index 时浮动。