Получить фактический идентификатор текущего пользователя без удаления сеанса? rails will_paginate dilema
Я хочу получить реальный идентификатор пользователя из-за проблемы в URL для will_paginate, в которой мне нужно установить его вручную, поэтому я хочу получить целевую ссылку для разбивки на страницы с помощью пользовательского метода визуализации в представлении, подобном этому,
<%= will_paginate @friends, :renderer => WillPaginateHelper::MyLinkRenderer %>
И помощник что-то вроде
module WillPaginateHelper
class MyLinkRenderer < WillPaginate::ActionView::LinkRenderer
include SessionsHelper
protected
def link(text, target, attributes = {})
if target.is_a?(Integer)
attributes[:rel] = rel_value(target)
target = "/users" + current_user.id + "/friends?page=#{target}"
end
attributes[:href] = target
tag(:a, text, attributes)
end
end
end
Линия target = "/users" + current_user.id + "/friends?page=#{target}"
является важным, где мне нужно установить URL для якорных ссылок will_paginate с текущим идентификатором пользователя.
Проблема в том, что когда запускаемый мной помощник запускается в представлении для установки URL, я получаю сообщение об ошибке undefined local variable or method session...
Вы не можете использовать хеш сессий в помощниках, так как получить реальный идентификатор current_user для вставки в переменную. Удалить / уничтожить сеанс, получить идентификатор и создать новый? Проблема заключается в том, что как только я удаляю сеанс, как получить идентификатор, после того как я удаляю сеанс и ссылка на пользователя удаляется.
Причина, по которой у меня есть действие указателя # друзей, которое отображается в элементе div и при первоначальном вызове URL-адреса нумерация страниц правильно присоединяется к URL-адресу users/:id/friends
поэтому каждый запрос на нумерацию страниц направляется правильному пользователю и действию. Но это индексное представление имеет прикрепленную к каждому отображаемому другу форму "Разобрать", чтобы вы могли уничтожить дружбу, которая переходит к действию уничтожения контроллера друзей, так что разметка, например, <form... action="friends/177"...>
и при полном просмотре перезагрузка действия индекса из действия уничтожения приведет к разбивке страниц на последнюю известную ссылку, если не переопределена. Таким образом, когда действие индекса полностью отображается снова, ссылки на страницы friends/177
которые в любом случае выдают ошибку сервера и не имеют смысла, поскольку эта запись только что была уничтожена.
У меня есть переменные current_user и идентификатор в моем действии уничтожения, но я не могу найти способ передать их в мой вспомогательный метод или просто получить текущий идентификатор пользователя из сеанса.
1 ответ
Хорошо, спасибо Максу и всем за помощь. нашел этот пост и этот ответ здесь, что вы можете сделать что-то вроде,
В ваших маршрутах
get 'users/:cu_id/friends', to: 'users#index', as: :my_friends
И для просмотра
<%= will_paginate @friends, params: { controller: :users, :cu_id => current_user.id } %>
Это будет производить users/:cu_id/friends?page=2
... конечно:cu_id будет фактическим идентификатором, для нумерации страниц.
РЕДАКТИРОВАТЬ: Порядок важен здесь, если у вас есть другие маршруты, идущие по тому же URL, например, users/:user_id/friends
когда вы вкладываете ресурсы, вам нужно поставить get 'users/:cu_id/friends',...
ниже этого, поскольку рельсы построят правильный маршрут для вас, так как будут разбиты на страницы, но вернитесь через действие друзей #index, когда разбито на страницы и сопоставлены, например, users/1/friends
через users/:user_id/friends
как это сначала в порядке в rout.rb. Здесь в руководстве по рельсам объясняется, как это работает.