Rails 通过提交解析 Ransack 参数

Rails Parse Ransack parameters with submit

我有一个 Rails 应用程序并使用 ruby 2.3.3.

对于我的表单,我使用 simple_form、Ransack 进行过滤和 will_paginate。

我有 'set_per_page' 下拉菜单,所以用户可以 select 如果想在 table 中看到 20、200 或 200 个帖子。

= form_tag({ action: "index"}, { method: "get", id: "post_index"}) do
  =select_tag :per_page, otions_for_select( [20,200,2000], params[:per_page].to_i )

我的javascript是这样的:

$(document).ready(function() {
  $("#per_page").change(function() {
    $("#post_index").submit();
  });
});

因此,当用户更改下拉菜单时,它将再次呈现操作 'index' 并将 per_page 参数设置为 selected 值。到目前为止一切顺利,但是当我提交 Ransack 参数时,参数消失了。

当我用 Ransack 过滤时,URL 是:

http://localhost:3001/posts?q[name_eq]=Foo&q[title_eq]=Bar

当我 select 'per_page' 下拉列表时,我的 URL 将变为:

http://localhost:3001/posts?per_page=200

如何将 Ransack 调用的参数解析为 per_page 调用。所以我会有这样的URL:

http://localhost:3001/posts?q[name_eq]=Foo&q[title_eq]=Bar&per_page=200

编辑:

我试过在这样的隐藏字段中添加 Ransack 参数:

= form_tag({ action: "index"}, { method: "get", id: "post_index"}) do
  =select_tag :per_page, otions_for_select( [20,200,2000], params[:per_page].to_i )
  =hidden_field_tag :q, params[:q] if params[:q].present?

但这会导致错误:

undefined method `merge' for "#<ActionController::Parameters:0x175c6110>":String

您需要将 hidden_tag 添加到 ransack 表单并更新它的值并在更改时提交

将隐藏标签添加到您的表单:

= semantic_search_form_for(@q) do |f|
    ...
    = f.hidden_field :per_page, value: params[:q][:per_page] || 20
    ...

将 select 与 per_page 放在任意位置:

= select_tag :per_page, options_for_select(["20", "200", "2000"], params[:q][:per_page])

添加脚本:

javascript:
$('#per_page').on('change', function() {
    $('#q_per_page').val(this.value);
    $('#search').submit();
});

根据 Michael Malov 的回复,我创建了这个:

我在 Ransack 搜索表单中添加了:

= search_form_for @q do |f|
  = f.hidden_field :per_page, value: @per_page

javascript现在是:

$('#per_page').on('change', function() {
  $('#q_per_page').val(this.value);
  $('#search').submit();
});

下拉菜单现在是:

= form_tag({ action: "index"}, { method: "get", id: "post_index"}) do
  =select_tag :per_page, otions_for_select( [20,200,2000], @per_page )

在控制器内部我有:

@per_page = params[:q].present? ? params[:q][:per_page] : 20