Rails 3 w / Devise: Как установить две отдельные домашние страницы в зависимости от того, аутентифицирован ли пользователь или нет? - PullRequest
8 голосов
/ 17 января 2012

Я использую Rails 3 и Devise для создания приложения, где пользователи приходят на веб-сайт и им показывают домашнюю страницу, содержащую логин и форму регистрации.Эта страница имеет свой собственный контроллер («домашняя страница»), поэтому ее маршрут

root :to => "homepage#index"

. Я хочу отобразить другую домашнюю страницу, если пользователи уже вошли в систему. Это будет означать, что корневая точка к

root :to => "dashboard#index"

Есть ли способ в условном маршруте в файле rout.rb, который позволил бы мне проверить, прошел ли пользователь аутентификацию, прежде чем направлять его на одну из этих домашних страниц?

Я попытался использовать следующий код, но если я не вошел в систему, devise просит меня войти в систему, поэтому ясно, что работает только первый маршрут.

authenticate :user do
  root :to => "dashboard#index"
end
  root :to => "homepage#index"

Кроме того, я хочуURL в обоих случаях указывают на www.example.com, чтобы в браузере никогда не появлялись www.example.com/dashboard/index и www.example.com/homepage/index.

Спасибо, миллион!!!

Ответы [ 4 ]

13 голосов
/ 17 января 2012

Попробуйте, это специфично для Warden / Devise.

root to: "dashboard#index", constraints: lambda { |r| r.env["warden"].authenticate? }
root to: "homepage#index"
5 голосов
/ 17 января 2012

В вашем HomeController:

def index
  if !user_signed_in?
    redirect_to :controller=>'dashboard', :action => 'index'
  end
end
2 голосов
/ 06 ноября 2014

Вот правильный ответ с рельсами 4

root to: 'dashboard#index', constraints: -> (r) { r.env["warden"].authenticate? },
         as: :authenticated_root
root to: 'homepage#index'

Я пытался добавить это / отредактировать принятый ответ, но это слишком много для редактирования, очевидно, чтобы быть принятым. В любом случае, проголосуйте за принятый ответ (от Брэдли), он помог мне придумать этот:)

2 голосов
/ 26 апреля 2013

(Точно такой же вопрос ответил здесь: https://stackoverflow.com/a/16233831/930038. Добавление ответа здесь также для справки других.)

В вашем routes.rb:

authenticated do
  root :to => 'dashboard#index'
end

root :to => 'homepage#index'

Это будетубедитесь, что root_url для всех аутентифицированных пользователей равно dashboard#index

Для справки: https://github.com/plataformatec/devise/pull/1147

...