friendly_id url 不适用于分页。
friendly_id url are not applying on pagination.
我正在对现有源代码实施 friendly_id
。场景是这样的。主页上有 category
个名字。当用户点击这些类别中的任何一个 link 时,如果该类别下有产品,它会将他们带到一个页面。这个页面有分页。较早的 url 曾经有 category_id=number
,现在在实施 friendly_id
之后,我得到了 url 作为 category_id=name
。
旧url:
localhost:3000/search?category_id=208
新 url:
localhost:3000/search?category_id=name
这个url有分页。
问题是当我点击此 url 的第 2 页时,它仍然具有相同的旧 url,其 ID 编号如下所示。
localhost:3000/search?category_id=208&page=2
我知道我错过了什么。有人可以告诉我如何解决这个问题。以下是我的控制器。 (这真是一团糟。当您尝试在现有代码上实现新事物时会发生这种情况。)请检查包含 @equipments
的行尾以进行分页。如果需要更多信息,请告诉我。
控制器
def search_equipments
begin
if (params.keys & ['category_id', 'sub_category', 'manufacturer', 'country', 'state', 'keyword']).present?
if params[:category_id].present?
@category = Category.active.friendly.find_by_friendly_id params[:category_id]
else
@category = Category.active.friendly.find_by_friendly_id params[:sub_category] if params[:sub_category].present?
end
@root_categories = Category.active.roots
@sub_categories = @category.children.active if params[:category_id].present?
@sub_categories ||= {}
@countries = Country.active.all
@manufacturers = Manufacturer.active.all
@states = State.active.where("country_id = ?", params[:country]) if params[:country].present?
@states ||= {}
unless params[:category_id].present? && params[:sub_category].present?
params[:category_id] = @category.id if params[:category_id].present?
params[:sub_category] = @category.id if params[:sub_category].present?
end
@equipments = Equipment.active.filter(params.slice(:manufacturer, :country, :state, :category_id, :sub_category, :keyword)).order("#{sort_column} #{sort_direction}, created_at desc").page(params[:page]).per(per_page_items)
else
redirect_to root_path
end
rescue Exception => e
render :file=>"#{Rails.root}/public/404.html",:status=>404
end
end
我认为您需要传递 slug
而不是传递 category_id
并相应地在 filter()
中进行更改
@equipments = Equipment.active.filter(params.slice(:manufacturer, :country, :state, :category_id, :sub_category, :keyword)).order("#{sort_column} #{sort_direction}, created_at desc").page(params[:page]).per(per_page_items)
希望对您有所帮助!
如果您使用的是 kaminari,您应该在呈现页面的视图文件中包含如下内容 links/numbers:
<%= paginate @equipments, params: request.query_parameters.merge(category_id: @category.slug) %>
你可以在里面试试这个 paginate helper
params: request.query_parameter
获取查询参数,然后您可以在该请求中设置 slug。
我正在对现有源代码实施 friendly_id
。场景是这样的。主页上有 category
个名字。当用户点击这些类别中的任何一个 link 时,如果该类别下有产品,它会将他们带到一个页面。这个页面有分页。较早的 url 曾经有 category_id=number
,现在在实施 friendly_id
之后,我得到了 url 作为 category_id=name
。
旧url:
localhost:3000/search?category_id=208
新 url:
localhost:3000/search?category_id=name
这个url有分页。
问题是当我点击此 url 的第 2 页时,它仍然具有相同的旧 url,其 ID 编号如下所示。
localhost:3000/search?category_id=208&page=2
我知道我错过了什么。有人可以告诉我如何解决这个问题。以下是我的控制器。 (这真是一团糟。当您尝试在现有代码上实现新事物时会发生这种情况。)请检查包含 @equipments
的行尾以进行分页。如果需要更多信息,请告诉我。
控制器
def search_equipments
begin
if (params.keys & ['category_id', 'sub_category', 'manufacturer', 'country', 'state', 'keyword']).present?
if params[:category_id].present?
@category = Category.active.friendly.find_by_friendly_id params[:category_id]
else
@category = Category.active.friendly.find_by_friendly_id params[:sub_category] if params[:sub_category].present?
end
@root_categories = Category.active.roots
@sub_categories = @category.children.active if params[:category_id].present?
@sub_categories ||= {}
@countries = Country.active.all
@manufacturers = Manufacturer.active.all
@states = State.active.where("country_id = ?", params[:country]) if params[:country].present?
@states ||= {}
unless params[:category_id].present? && params[:sub_category].present?
params[:category_id] = @category.id if params[:category_id].present?
params[:sub_category] = @category.id if params[:sub_category].present?
end
@equipments = Equipment.active.filter(params.slice(:manufacturer, :country, :state, :category_id, :sub_category, :keyword)).order("#{sort_column} #{sort_direction}, created_at desc").page(params[:page]).per(per_page_items)
else
redirect_to root_path
end
rescue Exception => e
render :file=>"#{Rails.root}/public/404.html",:status=>404
end
end
我认为您需要传递 slug
而不是传递 category_id
并相应地在 filter()
中进行更改
@equipments = Equipment.active.filter(params.slice(:manufacturer, :country, :state, :category_id, :sub_category, :keyword)).order("#{sort_column} #{sort_direction}, created_at desc").page(params[:page]).per(per_page_items)
希望对您有所帮助!
如果您使用的是 kaminari,您应该在呈现页面的视图文件中包含如下内容 links/numbers:
<%= paginate @equipments, params: request.query_parameters.merge(category_id: @category.slug) %>
你可以在里面试试这个 paginate helper
params: request.query_parameter
获取查询参数,然后您可以在该请求中设置 slug。