Настройка входа в Devise в качестве корневой страницы

84

Я использую следующий код для своих маршрутов:

devise_for :user, 
  :as => '', 
  :path_names => { 
    :sign_in => "", 
    :sign_out => "logout", 
    :sign_up => "register" 
  }

Но когда я выхожу из системы и иду, /logoutя получаю следующую ошибку:

Ни один маршрут не соответствует {: action => "new",: controller => "devise / sessions"}

Как мне настроить корневой путь к :sign_inдействию?

Логан Бейли
источник

Ответы:

125

Чтобы последовать примеру людей, которые спрашивают об ошибке, Could not find devise mapping for path "/"есть обходной путь.

Вы обнаружите, что в ваших журналах есть подсказка, которая, вероятно, скажет:

[Devise] Could not find devise mapping for path "/".
This may happen for two reasons:

1) You forgot to wrap your route inside the scope block. For example:

  devise_scope :user do
    match "/some/route" => "some_devise_controller"
  end

2) You are testing a Devise controller bypassing the router.
   If so, you can explicitly tell Devise which mapping to use:

   @request.env["devise.mapping"] = Devise.mappings[:user]

Поэтому я повторил подход, но вместо этого обернул его (как @miccet suggets) внутри блока области видимости:

devise_scope :user do
  root to: "devise/sessions#new"
end

Это сработало для меня

Питер Никси
источник
6
Это отправило меня в бесконечный цикл, дорогой читатель, у которого такая же проблема, следующий шаг ответа здесь stackoverflow.com/questions/19855866/…
Jngai1297
93
devise_for :users

devise_scope :user do
  authenticated :user do
    root 'home#index', as: :authenticated_root
  end

  unauthenticated do
    root 'devise/sessions#new', as: :unauthenticated_root
  end
end

Точно так же протестировано на Rails Rails 4.1.0.rc1.

ВВДПзЗ
источник
1
Подозреваю, что все зависит от версии Rails и Devise. Это, безусловно, работает для Rails 4 с Devise 3 - большинство других ответов нет.
Крис Льюис
Я считаю, что это лучший способ сделать это. Он работает с Rails 4.2.7.1 и Devise 4.2.0
Луис Лескано Айральди
23
root :to => "devise/sessions#new"

Мне нужно было установить домашний корень по умолчанию. Мне казалось, что я пробовал это всю ночь прошлой ночью (до публикации вопроса), но теперь это работает. Если вы вышли из системы, Devise попытается перенаправить вас на корневой путь, который у меня был undefined.

Логан Бейли
источник
14
ЛЮБАЯ ИДЕЯ, ПОЧЕМУ Я ЭТО ПОЛУЧАЮ? Не удалось найти сопоставление для пути "/". Может быть, вы забыли обернуть свой маршрут внутри блока области видимости?
baash05 07
Существует решение этой ошибки «не удалось найти сопоставление устройства», которое для ясности я опубликовал в отдельном ответе на этой странице: stackoverflow.com/a/12994856/400790
Peter Nixey
15

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

root :to => redirect("/users/login")
Жиля
источник
3
Обратите внимание, что этот маршрут является перенаправлением. Страница входа не отображается на корневом URL-адресе. Для этого вам необходимо создать маршрут devise_scope: user do root: to => "devise / sessions # new" end, как предложено @PeterNixey
Роберт
11

Я получил это для работы с ответом @VvDPzZ. Но пришлось немного доработать

  devise_scope :business_owner do
    authenticated  do
      root to: 'pages#dashboard'
    end

    unauthenticated do
      root to: 'devise/sessions#new', as: 'unauthenticated_root'
    end
  end  

Мне пришлось указать to:в объявлении корневого пути. Я также удалил, as: :authenticated_rootпотому что в моем приложении уже были ссылки root_pathв некоторых местах . Путем исключения as: :authenticated_rootчасти мне не пришлось менять ни одну из моих существующих ссылок.

Дуг Стейнберг
источник
3

Я думаю, у вас разные роли пользователей. Если вам нужно добавить такую ​​область видимости к ресурсу пользователей:

  devise_scope :user do
    get "/logout" => "devise/sessions#destroy"
  end

Вы можете узнать больше о переопределении маршрутов разработки здесь: https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes

Miccet
источник
Дело не в том, что я не могу получить доступ к маршруту выхода. Это когда вы выходите из системы, маршрут выхода перенаправляет вас на root.
Логан Бейли
1

Некоторые из этих решений слишком сложны. Просто используйте Rails:

Добавьте 'get' 'users/root', to: 'users#root'в config / routes.rb.

В UsersController сделайте что-нибудь вроде:

def root
  if user_signed_in?
    redirect_to root_for_signed_in_user_path (or whatever)
  else
    redirect_to new_user_session_path
  end
end
Джесси Фармер
источник
0

Используя rails 3.2 и devise 3.2.3, мне удалось настроить мою домашнюю страницу « home # index » (действие контроллера) в качестве страницы входа в систему, внося следующие изменения.

# 1 Добавлена ​​форма входа на главную страницу:

<%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
    <%= f.input :email %>
    <%= f.input :password %>
    <%= f.button :submit %>
<% end %>

# 2 Добавлены методы resource_name, resource и devise_mapping в app / holdingpers / application_helper.rb :

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[:user]
end

# 3 Создал пользовательский контроллер сессий app / controllers / users / sessions_controller.rb :

class Users::SessionsController < Devise::SessionsController

   protected

   # This method tell sessions#create method to redirect to home#index when login fails.
   def auth_options
      { scope: resource_name, recall: 'home#index' }
   end

end

# 4 Пропустите маршруты сеансов и настройте пользовательский контроллер сеансов в config / routes.rb :

devise_for :users, path: 'auth', skip: [:sessions],
           controllers: {
               sessions: 'users/sessions'
           }

as :user do
  get 'auth/sign_in' => 'home#index', as: :new_user_session
  post 'auth/sign_in' => 'users/sessions#create', as: :user_session
  delete 'auth/sign_out' => 'users/sessions#destroy', as: :destroy_user_session
end
Руи Кастро
источник