2014-02-19 4 views
3

Я прочитал несколько сообщений об устранении неполадок stored_location_for здесь, но, похоже, не понял его и не знаю, как устранить неполадки.Devise stored_location_for (resource) возвращает nil

Я пробовал удалить мой обычай after_sign_in_path_for, но это тоже не сработало. Мое местоположение никогда не сохраняется, хотя, как я понимаю, после каждого сеанса/обновления страницы он должен хранить местоположение. Нужно ли мне это через фильтр вручную?

def after_sign_in_path_for(resource) 
    stored_location_for(resource) || 
     if resource.is_a?(Account) 
     add_quote_to_account(resource) 
     if resource.applications.any? 
      edit_application_path(resource.applications(true).last) 
     else 
      root_path 
     end 
     else 
     super 
     end 
    end 

ответ

6

Возможно, вы не храните место, куда захотите переадресовать, после входа в систему с помощью устройства. Разрабатывают предоставляет два метода - store_location_for и stored_location_for https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/store_location.rb

Предположим, что ваша модель пользователя с именем «пользователь», то

  1. Вызов к store_location_for (пользовательский, my_desired_path) в контроллере будет хранить URL «my_desired_path "в сеансе с ключом" user_return_to ". В основном этот метод просто сделает это - session ["user_return_to"] = my_desired_path. Возможно, вам это не хватает. У меня есть контроллер бронирования и «вход» действие, которое хранит местоположение оформления заказа на бронирование в контроллере бронирования и отображает форму входа для пользователей оказанного зрения -

    def login 
        my_desired_path = url_for(controller: 'bookings', action: 'checkout') 
        store_location_for(:user, my_desired_path) 
    end 
    
  2. Теперь вы можете использовать stored_location_for (: пользователь) для извлечения my_desired_path из вашей сессии. Так сказать, вызов stored_location_for (: пользователь) возвратит «my_desired_path

  3. Теперь, если вы используете stored_location_for в пользовательских after_sign_in_path_for. (: Пользователь), то он должен вернуть "my_desired_path"

. Дополнительная точка -

вызов stored_location_for. (: пользователь) возвращает сессию [: user_return_to], но и очищает эту сессию после возвращения значения если вашего формата редирект навигационного формата Так второй вызов stored_location_for (: пользователь) не вернет my_desired_path. И иногда это то, как мы хотим, чтобы наше приложение вел себя. Напротив, если ваш формат перенаправления не является навигационным форматом, тогда сеанс не будет очищен, а второй вход снова перенаправится на тот же «my_desired_path».

Иногда вы хотите перенаправить в разные места при входе с разных страниц в своем приложении. Предположим, вы хотите перенаправить «\ X» на странице А и «\ Y» на странице B. Теперь выполните следующие действия -

  1. пользователя в на странице А - store_location_for (пользовательский, «\ X») сохраняется в сеансе.
  2. Приложение предоставляет форму входа, но Пользователь не выполняет вход и не просматривает здесь и там в вашем приложении.
  3. Пользователь находится на странице B и выполняет вход, ожидающий приземления на «\ Y», но неожиданно приземляется на «\ X».

Так что позаботьтесь об этом в своем приложении. Этот сценарий чаще встречается в приложениях, которые используют AJAX для входа в систему.

+0

Чтобы добавить к вышесказанному, чтобы получить перенаправление на работу, вам необходимо переопределить метод #create файла session_controller.rb Devise. Изменение 'respond_with ресурс, местоположение: after_sign_in_path_for (ресурс)' к: 'respond_with ресурс, местоположение: stored_location_for (: пользователь) || root_path' где: пользователь - ваш ресурс. – Tebbers

Смежные вопросы