Нежелательные параметры формы добавляются в ссылки на страницы - PullRequest
11 голосов
/ 13 июня 2011

У меня есть страница, которая используется для поиска в списках путем отправки данных с помощью предоставленных форм.Параметры формы отправляются через ajax (пост-запрос), в таблице поиска создается новая запись, а затем отображаются списки (динамически, на той же странице, с которой отправляется форма) с помощью действия show для этой записи.

Результаты содержат ссылки на страницы, предоставляемые kaminari, например:

<%= paginate matches, 
  :params => {:controller => 'searches',
  # I have to specify the id because my searches are stored in the database
  :action => 'show', :id => search.id},
  :remote => true %>

Обратите внимание, что ссылки на страницы динамически добавляются на страницу.Поэтому, когда я выполняю новый поиск и получаю новые списки, сервер повторно отображает ссылки на страницы.

Вот мое действие show в контроллере поиска

def show
  @search = Search.includes(:rate).find(params[:id])
  @matches = @search.matches.order(sort_column + " " + sort_direction).page(params[:page])

  respond_to do |format|
    format.html
    format.xml { render :xml => @matches }
    format.js
  end
end

По какой-то причине я могуНе могу понять, все параметры, которые я использую в формах поиска (и их много), прикрепляются к URL-адресам разбивки на страницы kaminari, давая мне hrefs вроде этого:

<a href="/searches/145?massive parameter list omitted" data-remote="true" rel="next">2</a>

Список пропущенных параметровнастолько длинен, что слишком велик, чтобы быть действительным GET-запросом, и я получаю 414 код ошибки.

Как видно из результатов поиска -> показанного выше действия, он не нужен для нумерации страницчтобы добавить всю эту информацию.Все, что им нужно, это маршрут, идентификатор и номер страницы.

Как мне предотвратить это?

Кстати, я попытался установить :method => :post в настройках kaminari.Кажется, не помогает.Я использую Kaminari v 0.12.4 (последний) и Rails 3.1.rc4.

Ответы [ 4 ]

8 голосов
/ 18 июня 2014

Если у кого-то все еще есть проблемы с ссылками на нумерацию страниц, здесь есть исправление: Kaminari: исключить основные параметры формы из ссылок на нумерацию страниц

Хотя, это не работает со мной, так какбыло описано в описании фиксации, в ссылке все еще присутствуют нежелательные параметры (: authenticity_token,: commit,: utf8,: _method), но вы можете исключить их, установив для них значение nil

Например:

paginate @books, params: {authenticity_token: nil, commit: nil, utf8: nil, action: nil}

Результат:

<a href="/books?page=2">2</a>

ИЛИ

Контроллер:

def index
  # here search staff, messing our params hash
  @books = Books.all
  @pagination_params = normalize_pagination_params
end

private
def normalize_pagination_params
 params.inject({}) do |params_hash, p|
  unless p[0]=="controller"
    params_hash[p[0]] = nil
  end
  params_hash
 end
end

Вид:

paginate @books, params: @pagination_params
6 голосов
/ 21 сентября 2011

Общая идея

Вы можете исправить это, отредактировав частичные нумерации страниц, чтобы вручную удалить параметры из URL, а затем добавить параметры страницы обратно. Я знаю, что это взлом, но кажется, что это самый быстрый способ исправить эту проблему, если разбита нумерация страниц (как это было для меня).

Я расширяю это решение, опубликованное в отчете об ошибке GitHub для этой проблемы .

Вам необходимо отредактировать каждую из 5 партинаций ссылок на страницы: _page.html.erb (по номеру), _first_page.html.erb и _last_page.html.erb, _prev_page.html.erb и _next_page.html.erb.

Вы можете найти нужный номер страницы из локальных переменных, доступных в партиалах: current_page, page, num_pages.

Особые инструкции

Если вы этого еще не сделали, сгенерируйте частичные разбиения на страницы в своем приложении, запустив rails g kaminari:views default

Затем отредактируйте части следующим образом:

#_page.html.erb
<%
 unless page.current?
   url = url.split('?')[0] + '?page=' + page.to_s
 end
%>

<span class="page<%= ' current' if page.current? %>">
  <%= link_to_unless page.current?, page, url, opts = {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
</span>

# _first_page.html.erb
<span class="first">
  <% url = url.split('?')[0] + '?page=1' %>
  <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %>
</span>

# _prev_page.html.erb
<span class="prev">
  <% url = url.split('?')[0] + '?page=' + (current_page.to_i - 1).to_s %>
  <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote %>
</span>

# _next_page.html.erb
<span class="next">
  <% url = url.split('?')[0] + '?page=' + (current_page.to_i + 1).to_s %>
  <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote %>
</span>

# _last_page.html.erb
<span class="last">
  <% url = url.split('?')[0] + '?page=' + num_pages.to_s %>
  <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
</span>
0 голосов
/ 16 мая 2013

Старый пост.Лучшее решение.

Если вы используете kaminari для разбивки на страницы для вложенных ресурсов с обновлениями ajax, вы обнаружите, что Kaminari попытается построить URL-адрес на основе текущего пути, независимо от указанных вами параметров, что приведет к ошибке маршрутизации..

Самым чистым решением является использование шаблона с подстановочными знаками.

Если ваши постраничные комментарии для поста и контроллер комментариев с действием create и show, то:

В ваших маршрутах:

match '*path/comments(/:page)' => 'comments#show'

И виджет нумерации страниц:

<%= paginate @comments, params: { controller: :comments }, remote: true %>
0 голосов
/ 01 июля 2011

Вы можете попробовать очистить параметры, сохранив только то, что вам нужно, и удалив все остальное перед отображением результатов поиска.

Чтобы использовать сообщение, я думаю, что вы пропустили второй шаг, где вы должны переопределить партиалы ссылки kaminari: https://github.com/amatsuda/kaminari/wiki/Kaminari-recipes

...