Получить фактический идентификатор текущего пользователя без удаления сеанса? 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. Здесь в руководстве по рельсам объясняется, как это работает.

Другие вопросы по тегам