ROR 3. Devise. Управление пользователями
Сейчас мало таких сайтов, где не нужны были бы пользователи, точнее модель пользователей. Раньше, я как дурак, писал эту модель вручную, иногда, конечно, иначе и нельзя было поступить. А недавно я открыл для себя гем Devise для Rails, который в большинстве случаев избавляет от необходимости прописывать логику управления пользователями самому.
Все, что я опишу дальше есть как на офстранице гема, так и в этих видео (русская версия Railscasts):
Все нижепроделанное относиться к 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
.
Подробнее о настройках и прочих заморочках этого гема:
Это все хорошо, но когда починят RSS?
оно работает, по крайней мере у меня. http://blog.lukmus.ru/?feed=rss2
В каком браузере/RSS-клиенте у Вас проблемы?
Maxthon Browser v.3.3.4.4000
иду по линку:
http://blog.lukmus.ru/?feed=rss2
получаю:
XML File contains error:
error on line 1606 at column 108: EntityRef: expecting ‘;’
Кстати ответы на мыло тоже не приходят
Ответы на мыло от блога или по Devise?
Если от блога, то они и не должны.
RSS починю на неделе. Как починю, напишу в блоге.
RSS кстати починил, не неделя конечно прошла)))
[...] что уже есть сгенерированная и настроенная модель Devise. У меня модель называется User, а внедрять капчу я буду в [...]
Если надо автоматически залогинить пользователя, то нужно добавить в его сессию:
session["warden.user.user.key"]=["User", [@user.id], @user.encrypted_password[0..28]]
Здесь User – название модели Devise, @user – экземпляр модели User, под которым нужно залогинить пользователя.
Бывает такая ситуация, когда сессия 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
Такой вопрос: а можно ли заблокировать стандартную регистрацию через devise’овские контроллеры? т.к. приложение представляет собой API-сервер без самого сайта, и регистрация производится только уже существующим пользователем черз десктоп-клиент.
можно. перезагрузите контроллер registrations_controller.rb. Например:
config/routes.rb:
...
devise_for :users, :controllers => { :registrations => "registrations"}
...
app/controllers/registrations_controller.rb:
class RegistrationsController < Devise::RegistrationsController
def new
redirect_to '/404.html'
end
def edit
super
end
def create
redirect_to '/404.html'
end
end
Подробнее https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb