やりたいこと
- devise を入れてユーザー認証機能をつくりたい
- ついでに日本語化もしたい
手順
適当な Rails アプリを作成。
$ rails new devise-test
gemfile に今回使うgemを追記し bundle install 。
gem "devise" gem "devise-i18n"
deviseの機能をRailsアプリにインストール。
$ bin/rails g devise:install
こんな表示が出る。
Depending on your application's configuration some manual setup may be required: 1. Ensure you have defined default url options in your environments files. Here is an example of default_url_options appropriate for a development environment in config/environments/development.rb: config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } In production, :host should be set to the actual host of your application. * Required for all applications. * 2. Ensure you have defined root_url to *something* in your config/routes.rb. For example: root to: "home#index" * Not required for API-only Applications * 3. Ensure you have flash messages in app/views/layouts/application.html.erb. For example: <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> * Not required for API-only Applications * 4. You can copy Devise views (for customization) to your app by running: rails g devise:views * Not required *
ひとまず上から順に対応していく。4は後で別コマンドでおこなうので無視する。
config/environments/development.rb
#適当な場所に追記 config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
ルーティング
routes.rb
Rails.application.routes.draw do #追記(あとで作る) root to: "home#index" end
viewの編集
フラッシュメッセージと、ログインしてたら「ログアウトする?」を表示させるための記述をする。
app/views/layouts/application.html.erb
<!DOCTYPE html> <html> <head> <title>DeviseTest</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <body> #追記 <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> <% if user_signed_in? %> <%= link_to 'ログアウト', destroy_user_session_path, method: :delete %> <% end %> #追記ここまで <%= yield %> </body> </html>
Userモデル作成
ユーザーについての情報を保存するモデルをつくる。以下のコマンドで、deviseの機能をもったユーザーモデルが作られる。
$ bin/rails g devise User
マイグレーションを実行。
bin/rails db:migrate
devise認証用のviewファイルを生成
日本語化に対応したdeivseのviewファイルを生成する。
$ bin/rails g devise:i18n:views
画面表示のためのコントローラーを作成しておく。
$ bin/rails g controller home index
ログインしていなければ認証画面を表示させるため、before_action :authenticate_user!, only: :index
を追記。
app/controllers/home_controller.rb
class HomeController < ApplicationController #追記 before_action :authenticate_user!, only: :index def index end end
ログイン後にEmailアドレスを表示させるよう記述。
app/views/home/index.html.erb
<h1>Home#index</h1> <p>Find me in app/views/home/index.html.erb</p> #追記 <%= current_user.email %>
サーバーを起動。
$ bin/rails server
localhost:3000 へアクセス。
確認しても日本語にはなっていない。
ロケール変更
アプリのデフォルトロケールを変更。
config/application.rb
require_relative 'boot' require 'rails/all' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) module DeviseTest class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 6.0 #以下2文を追記 config.i18n.default_locale = :ja config.time_zone = "Asia/Tokyo" # Settings in config/environments/* take precedence over those specified here. # Application configuration can go into files in config/initializers # -- all .rb files in that directory are automatically loaded after loading # the framework and any gems in your application. end end
config.i18n.default_locale = :ja
を追記することで日本語になるconfig.time_zone = "Asia/Tokyo"
はタイムゾーンの設定
サーバーを再起動させて確認してみると。
日本語化された。登録ページも日本語化されているので、「アカウント登録」を押して適当なメールアドレスで登録してみると・・・
Emailが表示された。ログインが成功し、メッセージも日本語になっている。
リポジトリ
https://github.com/kotakanazawa/devise-test
ロケールファイルは必要ないのか?
devise-i18n
を使った場合、日本語の基本的な翻訳ファイルは gem に含まれている。なのでja.yml
に日本語のエラーメッセージなどを追記する必要はない。
カスタマイズや追加をしたくなったら、
$ bin/rails g devise:i18n:locale it
でファイルを生成できる。