Rails 3〜4 時代と比べ、2025 年までの Rails 5〜8 の変化により、Devise の使い方も少しずつ変わってきた。
ここでは、現在の Rails(7.x〜8.x)での Devise の使い方・変更点をまとめる。
Rails 3 時代のようにモデルに attr_accessible を書く必要はなくなり、
Devise でも parameter sanitizer の設定が必須になった。
application_controller.rb
before_action :configure_permitted_parameters, if: :devise_controller?
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
devise_parameter_sanitizer.permit(:account_update, keys: [:name])
end
Rails 7 の Turbo は、Devise の redirect や失敗時レンダリングと衝突することがある。
そのため、respond_to の追加か Turbo 無効化が必要。
class Users::SessionsController < Devise::SessionsController
respond_to :html, :turbo_stream
end
<form data-turbo="false">
…
</form>
Rails 5〜7 では コントローラ分離が前提のアプリが増えている。
devise_for :users, controllers: {
sessions: "users/sessions",
registrations: "users/registrations"
}
昔(Rails 3〜4 時代)は「Devise + OmniAuth」が鉄板構成だったが、
近年は以下の理由で 分割利用 or 自前構築が推奨される流れ。
現在のよくある構成:
Devise のメールリンクは Rails 側の URL オプション設定が必須。
config/environments/development.rb
config.action_mailer.default_url_options = { host: "localhost", port: 3000 }
昔は「なくても動く」ことが多かったが、
現在は 必ず設定が必要。
Rails 5.1 以降、System Test が標準化したためテスト方法が変わった。
spec/support/devise.rb
RSpec.configure do |config|
config.include Devise::Test::IntegrationHelpers, type: :request
end
login_as(user, scope: :user)
visit root_path
Controller Spec は廃止傾向で、Request Spec / System Spec へ移行が正しい。
Rails 5.2 以降、credentials.yml.enc が標準化。
Devise の pepper や secret key base を管理しやすくなった。
config/credentials.yml.enc の内容例
devise:
pepper: abc123xyz987
| 項目 | 昔 (Rails 3〜4) | 今 (Rails 7〜8) |
|---|---|---|
| パラメータ | attr_accessible | Strong Parameters |
| フロント | jQuery / UJS | Turbo (Hotwire) |
| 認証フロー | form+redirect | Turbo との衝突に注意 |
| 秘密情報 | secrets.yml | credentials.yml.enc |
| テスト | Controller Spec | Request / System Spec |
| JS | Sprockets | Importmap / Vite / Bun |
| OmniAuth | Deviseに組込 | 分割 or 非推奨傾向 |
Devise 自体の根本 API は大きく変わっていないが、
Rails 側の仕様変更に合わせて「書き方の正解」が変わっているのがポイント。