ROR 3. Devise. Управление пользователями

Сейчас мало таких сайтов, где не нужны были бы пользователи, точнее модель пользователей. Раньше, я как дурак, писал эту модель вручную, иногда, конечно, иначе и нельзя было поступить. А недавно я открыл для себя гем Devise для Rails, который в большинстве случаев избавляет от необходимости прописывать логику управления пользователями самому.
Все, что я опишу дальше есть как на офстранице гема, так и в этих видео (русская версия Railscasts):

  1. введение в devise
  2. настройка devise

Все нижепроделанное относиться к RoR версии выше 3.0.1.

установка

Сначала, как обычно, дописываем в Gemfile:

gem 'devise'

и далее опять же:

bundle install

Теперь надо сгенерировать/интегрировать/спарить/инсталировать/и т.д. rails-приложение и devise:

rails generate devise:install

После этого devise напишет мол надо настроить mailer и домашнюю страницу (root_url). Для режима development настроить mailer можно прописав в config/environments/development.rb опцию:

config.action_mailer.default_url_options ={ :host => 'localhost:3000' }

Далее надо сгенерировать модель пользователей для Devise и выполнить созданные миграции:

rails generate devise User
rake db:migrate

настройка и эксплуатация

маршрутизация

После установки devise пропишет свои особые маршруты. Строка в config/routes.rb вида:

devise_for :users

мало о чем скажет, поэтому посмотреть маршруты devise можно так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rake routes
        new_user_session GET    /users/sign_in(.:format)
            user_session POST   /users/sign_in(.:format)
    destroy_user_session DELETE /users/sign_out(.:format)
           user_password POST   /users/password(.:format)
       new_user_password GET    /users/password/new(.:format)
      edit_user_password GET    /users/password/edit(.:format)
                         PUT    /users/password(.:format)
cancel_user_registration GET    /users/cancel(.:format)
       user_registration POST   /users(.:format)
   new_user_registration GET    /users/sign_up(.:format)
  edit_user_registration GET    /users/edit(.:format)
                         PUT    /users(.:format)
                         DELETE /users(.:format)
...

Соответственно в представлении, например, ссылка на регистрацию будет выглядеть как:

1
<%=link_to 'Регистрация', new_user_registration_path %>

а на вход:

1
<%=link_to 'Войти', new_user_session_path%>

Стандартные пути можно изменить подкорректировав config/routes.rb, используя опцию path_names, например, для изменения пути регистрации изменения будут выглядеть так:

1
devise_for :users, :path_names=>{sign_up: 'register'}

методы

Также в первом видео еще рассказали метод, как узнать авторизован ли пользователь:

user_signed_in?

и, видимо, экземпляр класса модели User для текущего пользователя current_user, которая работает также как и экземпляр любой другой модели, например, узнать E-mail текущего авторизованного пользователя можно так:

current_user.email

фильтр

Еще один важный момент в начале второго видео про before_filter. Чтобы узнать недопустить неавторизованного посетителя до экшенов, нужно использовать фильтр:

before_filter :authenticate_user!

Он будет перенаправлять на страницу входа.

настройка представлений

Для того, чтобы иметь возможность редактировать представления devise их нужно привести к обычному виду файлов представлений:

rails g devise:views
      create  app/views/devise/_links.erb
      invoke  form_for
      create    app/views/devise/confirmations
      create    app/views/devise/confirmations/new.html.erb
      create    app/views/devise/passwords
      create    app/views/devise/passwords/edit.html.erb
      create    app/views/devise/passwords/new.html.erb
      create    app/views/devise/registrations
      create    app/views/devise/registrations/edit.html.erb
      create    app/views/devise/registrations/new.html.erb
      create    app/views/devise/sessions
      create    app/views/devise/sessions/new.html.erb
      create    app/views/devise/unlocks
      create    app/views/devise/unlocks/new.html.erb
      invoke  erb
      create    app/views/devise/mailer
      create    app/views/devise/mailer/confirmation_instructions.html.erb
      create    app/views/devise/mailer/reset_password_instructions.html.erb
      create    app/views/devise/mailer/unlock_instructions.html.erb

сообщения об ошибках

Все сообщения devise храняться в YML-файлах локалей, по умолчанию это config/locales/devise.en.yml. Для добавления своей локали нужно создать файл с аналогичным именем, например, config/locales/devise.ru.yml.
Скачать переведенные на другие языки (в т.ч. русский) локали devise можно тут: https://github.com/plataformatec/devise/wiki/I18n

валидация и прочие настройки

Настройки валидации, как и все остальные для этого гема, находятся в config/initializers/devise.rb. Отключить стандартную валидацию devise можно убрав модуль :validatable из модели, в данном случае User.
А вообще в devise вагон других настроек, например, теже ключи аутентификации, а которых говорят в конце второго видео, настраиваются все в том же config/initializers/devise.rb.
Подробнее о настройках и прочих заморочках этого гема:

  1. офстраница
  2. вики
  3. rubydoc

11 Comments to “ROR 3. Devise. Управление пользователями”

  1. Bighamster пишет:

    Это все хорошо, но когда починят RSS?

  2. [...] что уже есть сгенерированная и настроенная модель Devise. У меня модель называется User, а внедрять капчу я буду в [...]

  3. lukmus пишет:

    Если надо автоматически залогинить пользователя, то нужно добавить в его сессию:
    session["warden.user.user.key"]=["User", [@user.id], @user.encrypted_password[0..28]]

    Здесь User – название модели Devise, @user – экземпляр модели User, под которым нужно залогинить пользователя.

  4. lukmus пишет:

    Бывает такая ситуация, когда сессия Devise завершается если залогиненый пользователь посылает AJAX-запрос в режиме production, при этом в development все в порядке. Простой но не лучший способ избавиться от этого бага:
    в application_controller.rb закомментировать protect_from_forgery. Нормальный способ: подключить rails.js (https://github.com/rails/jquery-ujs). Подробнее лучше прочитать тут: http://rubyclub.com.ua/messages/show/16267-scaffold-destroy-%D1%83%D0%BD%D0%B8%D1%87%D1%82%D0%BE%D0%B6%D0%B0%D0%B5%D1%82-device-session

  5. Skarm пишет:

    Такой вопрос: а можно ли заблокировать стандартную регистрацию через devise’овские контроллеры? т.к. приложение представляет собой API-сервер без самого сайта, и регистрация производится только уже существующим пользователем черз десктоп-клиент.

Leave a Reply to lukmus

(обязательно)

(обязательно)