Встановлення Devise Login для кореневої сторінки


83

Для своїх маршрутів я використовую такий код:

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

Але коли я вийшов з системи і перейшов до /logoutмене, з’являється така помилка:

Жоден маршрут не відповідає {: action => "new",: controller => "devise / session"}

Як налаштувати кореневий шлях до :sign_inдії?

Відповіді:


123

Щоб продовжити з тих, хто запитує про помилку 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 and Devise. Це, безумовно, працює для Rails 4 з Devise 3 - більшість інших відповідей не відповідали.
Кріс Льюїс,

Я думаю, що це найкращий спосіб це зробити. Це працює з Rails 4.2.7.1 та Devise 4.2.0
Луїс Лескано Айральді

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

Мені потрібно було встановити домашній корінь за замовчуванням. Я відчував, що пробував це всю ніч минулої ночі (до публікації запитання), але зараз це працює. Якщо ви вийшли з системи, Devise намагається перенаправити вас на кореневий шлях, який я не визначив.


14
БУДЬ-ЯКА ІДЕЯ, ЧОМУ Я ЦЕ ОТРИМАЮ? Не вдалося знайти розроблене відображення для шляху "/". Можливо, ви забули обернути свій маршрут всередині блоку обсягу?
baash05

Існує рішення цієї «не вдалося знайти відображення DEViSE» помилки , які для наочності я розмістив в окремому відповіді на цій сторінці: stackoverflow.com/a/12994856/400790
Пітер Nixey

15

(Це було опубліковано як запропоновану редакцію , але це мала бути власною відповіддю. Я не знаю, має це сенс чи ні. Шановний анонімний редакторе! Не соромтеся розмістити цю відповідь як свою, і залиште мені коментар тому я видалю цю копію.)

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

3
Зверніть увагу, цей маршрут є переспрямуванням. Він не відображає сторінку входу на кореневій URL-адресі. Для цього вам потрібно створити маршрут devise_scope: user do root: to => "devise / session # 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


Це не так багато, що я не можу отримати доступ до маршруту виходу. Це коли ви виходите, маршрут виходу переспрямовує вас на 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

Використовуючи напрямні 3.2 та пристрій 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 Додані методи name_name, resource та devise_mapping до app / heldpers / application_helper.rb :

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

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

# 3 Створено спеціальну програму контролера сеансів / controllers / users / session_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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.