Нежелательные параметры формы добавляются к страницам с разбивкой по страницам
У меня есть страница, которая используется для поиска в списках путем отправки данных с помощью предоставленных форм. Параметры формы отправляются через ajax (post request), новая запись создается в таблице поиска, а затем списки отображаются (динамически, на той же странице, с которой отправляется форма) с помощью действия show
для этой записи.
В результате есть ссылки на страницы, на которые ссылается каминари:
<%= 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-адресам страницы для каминари, которые дают мне 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.
Ответы
Ответ 1
Общая идея
Вы можете исправить это, отредактировав частичные части страницы, чтобы вручную вычеркнуть параметры из 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>
Ответ 2
Если у кого-то все еще есть проблемы с ссылками на страницы, здесь есть исправление: 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
Ответ 3
Вы можете попробовать очистить параметры, сохранив только то, что вам нужно, и удалите все остальное, прежде чем отображать результаты поиска.
Чтобы использовать пост, я думаю, что вы пропустили второй шаг, когда вам нужно переопределить частичные ссылки канала Каминари: https://github.com/amatsuda/kaminari/wiki/Kaminari-recipes
Ответ 4
Старый пост. Лучшее решение.
Если вы используете kaminari для разбивки на страницы для вложенных ресурсов с помощью обновлений ajax, вы обнаружите, что Kaminari пытается создать URL-адрес на основе текущего пути, независимо от параметров, которые вы указали, что приводит к ошибке маршрутизации.
Самое чистое решение - использовать подстановочный шаблон.
Если ваши рассылающие комментарии для сообщения и есть контроллер комментариев с действием create и show, то:
В ваших маршрутах:
match '*path/comments(/:page)' => 'comments#show'
И виджет для разбивки на страницы:
<%= paginate @comments, params: { controller: :comments }, remote: true %>