在删除第 2 页上的最后一条记录时,将用户导航回第 1 页

On deleting the last record on page 2, navigate user back to page 1

我在 rails 应用程序上使用 Kaminari Gem。

我有当前索引页面和正确的导航菜单。

def index
  @dogs = Dog.all.page(params[:page]).per(20)
end


def destroy
  if @dog.destroy
    # use this so that if the page got other records, the user got to stay at that navigated page.
    redirect_back fallback_location: dogs_path, flash: { success: 'deleted dog from list' }
  else
    # show some errors
  end
end

当用户在第 2 页并删除第 21 条狗记录时,记录被删除并且浏览器显示没有记录的空白页面,因为 url 正在指定 /dogs?page=2

这是默认行为还是 Kaminari 或我的方法有问题?我之前希望 Kaminari 将用户重定向到 1 个页面,因为当前页面不包含任何记录。

谢谢。

您需要在删除操作完成后定义索引URL。我相信您已经完成了以下操作。

redirect_to :back 并保持在同一页上。

您应该使用索引页而不是返回页 URL。

一般在Rails5,现在可以使用redirect_back(the_path_that_you_want) 我正在考虑这样做,但在为空时仍会重定向到同一页面。嗯..

def delete
  ...
  prev_page = Dogs.page(params[:page]).per(20).count < 1 ? params[:page].to_i - 1 : params[:page]
  redirect_back(fallback_location: dogs_path(page: prev_page, notice: "...", anchor: "if_you_wanted_to"))
end

你可以使用 request.referer 下面是销毁的示例,首先你用 session[:return_to] = request.referrer 保存 referer,然后销毁你 return使用 redirect_to session.delete(:return_to)

返回上一页
def destroy
  session[:return_to] = request.referrer
  ....
  @dog.destroy
  if session[:return_to]
    redirect_to session.delete(:return_to)
  else
    redirect_to dogs_path
  end 
end

假设您的狗索引页面路径为 dogs_path

def destroy
  if @dog.destroy
    page = params[:page]
    #this is to check if we have more elements on the page or not
    @dogs = Dog.all.page(page).per(20)
    if @dogs.length == 0 
      page = (page - 1) > 1 ? page - 1 : 1  
    end
    redirect_to dogs_path(page: page)
  else
    # show some errors
  end
end