Настройка Devise Login для корневой страницы

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

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

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

Нет совпадений маршрутов {: action = > "new",: Контроллер = > "DEViSE/сессии" }

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

Ответ 1

Чтобы следить за людьми, которые спрашивают об ошибке 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 recommets) внутри блока области видимости:

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

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

Ответ 2

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.

Ответ 3

root :to => "devise/sessions#new"

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

Ответ 4

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

root :to => redirect("/users/login")

Ответ 5

Я получил это, чтобы работать с ответом @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, мне не пришлось менять какие-либо мои существующие ссылки.

Ответ 6

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

  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

Ответ 7

Использование рельсов 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/holdpers/application_helper.rb:

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

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

# 3 Создан пользовательский контроллер сеансов приложение/контроллеры/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

Ответ 8

Некоторые из этих решений слишком сложны. Просто используйте свои навыки Rails, чтобы пощекотать Devise вверх головой:

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

В UserController сделайте что-то вроде:

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