railsの日本語化

内容

投稿一覧ページとは別に、トップページを実装する

rails日本語化

1. エラーメッセージを日本語化

時刻を日本に合わせたため、ついでにエラーメッセージも日本語化する(application.rbのみ編集済み)
日本語に対応するgemを導入
Gemfile

gem 'rails-i18n'
#devise日本語化
gem 'devise-i18n'

ターミナル

% bundle install
% rails s
% rails g devise:i18n:locale ja

config/localesディレクトリにファイルが作成され、自動的に日本語化してくれている
しかしこのままではGem 'rails-i18n'やdevise.ja.ymlを導入したことによって使える日本語しか含まれていないので、deviseのデフォルト以外の文字は英語で表示されてしまう
したがって、これらを翻訳するファイルを手動で作成
config/localesディレクトリに、ja.ymlというファイルは既に作成しているので、そこに追記していく
config/locales/ja.yml

例)以下のように日本語化されていない単語を日本語登録する
ja:
  activerecord:
    attributes:
      user:
        nickname: ニックネーム
      post:
        comment: コメント
      comment:
        comment: コメント

モデルのバリデーションのメッセージも日本語にしておく
user.rb

# 例)
validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: 'は半角英数字混合で入力してください' }

2. テストコードを修正

テストコードのエラーメッセージの部分を日本語に修正
user_spec.rb

# 元
expect(@user.errors.full_messages).to include("Nickname can't be blank")
# 日本語化
expect(@user.errors.full_messages).to include("ニックネームを入力してください")

修正できたらテストを実行して確かめる
ターミナル

% bundle exec rspec spec/models/user_spec.rb 

コメント機能

Action Cableを用いてコメントの即時更新機能を実装する
理解に時間がかかりそうだったのと、このアプリにおいては必須ではないため、即時更新機能は保留とすることにした

トップページ機能

1. ルーティングを設定

ルートパスをindexからtopに変更する
routes.eb

root to: 'posts#top'

2. コントローラーを編集

postsコントローラーでtopアクションを定義
posts_controller.rb

before_action :authenticate_user!, except: %i[top index show search]

def top
end

3. ビューを編集

これまでroot_pathはindexアクションを呼び出していたが現在はtopアクションに変更されている
投稿が完了した時等の何かしらのアクションを起こした後は、indexアクションを呼び出し投稿一覧ページを表示させるようにする
root_path→posts_pathに修正
また、top.html.erbを作成し、ログインボタン等を記述

4. application_controller.rbを編集

deviseはサインアップやサインインした時、デフォルトでルートパスに遷移するように設定されている
トップページからログインすると投稿一覧ページに遷移させたいため、コントローラーを編集する
application_controller.rb

def after_sign_in_path_for(resource)
  posts_path
end

def after_sign_up_path_for(resource)
  posts_path
end

次回

住所登録/検索機能を実装する

参考

CSSでボタンクリックの動きをつけたい時

押し込み式ボタンを作成した時、最初は以下のように記述していた
top.css

.top-btn {
  border-bottom: 0.2rem solid #800000;
}

.top-btn:active {
  transform: translateY(0.2rem);
  border-bottom: none;
}

しかし、これだと前後の要素も一緒に動いてしまった
marginの相殺やらが悪さするらしいが、今回はmarginを特に指定していない
translateYを用いるとボタンの下がすべて動いてしまうのか?
いまいちわからないが以下のように編集すると問題なく動いた
top.css

.top-btn {
  position: relative;
  box-shadow: 0 0.2rem #800000;
}

.top-btn:active {
  top: 0.2rem;
  box-shadow: none;
}