Хотите простой логин для вашего приложения на rails? Я расскажу об этом в данном руководстве.
Мы потребуем от пользователя войти в систему, чтобы получить доступ к определенным страницам. Обратите внимание, что это простой вход, роли пользователей и аутентификация не будут рассматриваться в этом посте.
Сначала мы создадим простые страницы, чтобы продемонстрировать, как сайт требует от пользователя входа в систему.
Создание страниц
Я создам две страницы, admin и home.
Создайте представления, admin.html.erb
и home.html.erb
в app/views/pages/
.
// app/views/pages/admin.html.erb
<h1>Admin Home</h1>
<p>app/views/pages/admin.html.erb</p>
// app/views/pages/home.html.erb
<h1>Home</h1>
<p>app/views/pages/home.html.erb</p>
Теперь создайте контроллер для этих страниц в app/controllers/
.
# app/controllers/pages_controller.rb
class PagesController < ApplicationController
def home
end
def admin
end
end
Наконец, создайте маршруты для этих страниц.
# config/routes.rb
get "/admin" => "pages#admin", as: "admin"
root "pages#home"
Страницы должны работать, если проверить ваш локальный хост. Страница для localhost:3000
должна быть app/views/pages/home.html.erb
, а localhost:3000/admin
— app/views/pages/admin.html.erb
.
Создание входа в систему
Теперь, когда страницы сделаны, мы начнем реализовывать систему входа. Я буду использовать devise gem. В нем есть все, что нужно для простого входа в систему.
-
Установите devise gem, добавив его в свой Gemfile:
gem 'devise'
Затем запустите bundle install.
-
Сгенерируйте необходимые файлы для devise, запустив это в терминале:
$ rails generate devise:install
Если вы используете rails 7, вы можете столкнуться с ошибкой. Вам может понадобиться вставить этот код в ваш
config/initializers/devise.rb
:источник
-
Создайте файлы миграции, которые мы будем использовать.
$ rails generate devise MODEL
Замените
MODEL
на имя класса, используемого для пользователей приложения (я в основном используюUser
, но может быть иAdmin
).Затем запустите
rails db:migrate
. -
Требуйте, чтобы пользователь входил в систему при посещении страницы администратора.
Это можно сделать, обновив
app/controllers/pages
.class PagesController < ApplicationController before_action :authenticate_user!, only: :admin def home end def admin end end
Функция
before_action :authenticate_user!
будет проверять, вошел ли пользователь в систему. В зависимости от модели вам может понадобиться изменить наauthenticate_MODEL!
, например, если вы решили назвать свою модель deviseAdmin
, то это должно бытьauthenticate_admin!
.Добавив
only: :admin
, действие будет выполняться только при действии admin(app/views/pages/admin.html.erb).
Это должно помочь! Перезапустите ваш сервер и проверьте его!
Добавление ссылок (необязательно)
Здесь я добавлю ссылки входа и выхода для сайта.
-
Создайте файл
_user_detail.html.erb
вapp/views/shared/
.// app/views/shared/_user_detail.html.erb <% if user_signed_in? %> <%= button_to("Log Out", destroy_user_session_path, method: :delete) %> <% else %> <%= link_to 'Log in', new_user_session_path %> <% end %>
Если вы используете rails 7, кнопка выхода из системы может работать некорректно, вам нужно использовать это:
<%= button_to("Log Out", LOGOUT_PATH, method: :delete) %>
.
источникПути здесь — это пути входа и выхода. Вы можете проверить свои, запустив
rails routes
.user_signed_in?
— это помощник в devise. Он возвращает true или false в зависимости от того, вошел ли пользователь в систему. Это может меняться в зависимости от выбранного имени для модели devise. Если вы выбралиAdmin
, то это должно бытьadmin_signed_in?
. -
Добавьте ссылки на
app/views/pages/home.html.erb
иapp/views/pages/admin.html.erb
.<%= render "shared/user_detail"%>
Ссылки:
- https://stackoverflow.com/questions/36646226/undefined-method-user-url-for-devise-sessionscontrollercreate
- https://dev.to/spaquet/rails-7-devise-log-out-d1n
- https://github.com/heartcombo/devise
Вы можете ознакомиться с моим репозиторием здесь.
Пожалуйста, не репостите