rails 3 / heroku / devise: как указать другую «целевую страницу» при входе пользователей?

#ruby-on-rails #devise

#ruby-on-rails #разработка

Вопрос:

Мы хотели бы иметь 3 разные формы входа для нашего приложения:

  • форма входа по умолчанию выводит их на обычную панель управления (как мы делаем сейчас)

  • форма входа «foo», которая, если они используют ЭТУ форму для входа, выводит их на экран специального назначения

  • форма входа в систему «bar», которая выводит их на еще один специальный экран

Я предполагаю, что правильный подход заключается в том, чтобы как-то

a) создайте новый маршрут для / foo и /bar , вероятно, направляя оба к ОДНОМУ и тому ЖЕ методу входа, но в маршрут добавьте параметр url ‘signin_type’, сообщающий нам, какой это «тип» формы входа?

б) реализовать пользовательский метод (ы) RegistrationsController (какое имя?) для обработки формы входа (у нас уже есть пользовательский метод создания и создания при регистрации, поскольку в нашей регистрационной форме необходимо добавить поле «реферальный код»), и чтобы метод просматривал параметр url ‘signin_type’, чтобы перенаправить знак либо на обычный, либо на foo, либо на bad

c) реализовать другой метод, который обрабатывает отправку входа (это другой метод?) это рассматривает какое-то специальное значение встроенной формы, чтобы определить, какая форма подписи использовалась?

Это мое лучшее предположение. Если правильно, то это как сделать (b) и (c), которые ставят меня в тупик. Любые мысли будут оценены!

Ответ №1:

Я думаю, вы, возможно, пытаетесь перепроектировать это. Я бы подошел к этому с помощью одной страницы sign_in и просто использовал условную логику при переопределении after_sign_in_path_for(resource) метода для контроллера Devise. Это не только будет намного проще реализовать сейчас, но и будет намного проще поддерживать в будущем. Просто добавьте в свой ApplicationController.rb :

 protected

  def stored_location_for(resource)
    nil
  end

  def after_sign_in_path_for(resource)
    if condition_foo
      redirect_to foo_url
    elsif condition bar
      redirect_to bar_url
    else
      redirect_to dashboard_url
    end
  end
  

Первый метод переопределяет местоположение Devise по умолчанию root и устанавливает его равным нулю, тогда логика после этого довольно понятна. Это должно работать для того, что вы хотите.

Комментарии:

1. Спасибо, но если я правильно понял предложение, это не позволило бы мне иметь разные страницы входа (3 страницы входа должны выглядеть по-разному, потому что они входят в разные «части» приложения)

2. На самом деле у вас все еще может быть 3 разные страницы входа, если хотите. Просто следуйте этому руководству, чтобы добавить форму входа на любую страницу, которую вы хотите. Затем он будет следовать логике моего ответа, чтобы перенаправить в соответствующее место.