プログラミング備忘録

プログラミングの学習状況をメモしています

63日目

今日の学習

Ruby on Rails

共同開発

共同開発が徐々に進んでいる。他の方が行った作業をチェックしたり、他の方の作業が終わった後にやるべきタスクをやったりと、一人ではなかなか経験できないことが多い。

他の方の作業が終わった後に取り掛かる作業に関するメモ。

  1. developブランチに移動
  2. git pull origin HEADで最新の状態にする
  3. bundle installを実行
  4. yarn install --check-filesを実行
  5. rails db:migrateを実行
  6. 次の作業へ
プルリク確認時にエラー

他の方が行ったプルリクをローカルで確認する方法。

git fetch origin pull/プルリク番号/head:ブランチ名
git switch ブランチ名

プルリクのページで番号やブランチ名を確認して行う。

色々変更してしまったローカルの変更を元に戻すコマンド。

git checkout .

他の方のプルリクをローカルで確認しようとサーバーを立ち上げると、以下のようなエラーが出た。

SassC::SyntaxError in Devise::Sessions#new

Error: File to import not found or unreadable: bootstrap/scss/bootstrap.
        on line 6:1 of app/assets/stylesheets/application.scss
>> @import 'bootstrap/scss/bootstrap';

結論から言うと、webpackerをインストールしたら解決した。

問題になっている行をコメントアウトしてから再度サーバーを立ち上げてみると、今度はwebpacker絡みのエラーが起きたので、もしかしてちゃんとインストールできていないからではないかという推測に至った。

Active Admin

以前にもActive Adminのgemを用いて管理者画面を実装する練習をしてみたが、今回の共同開発で管理者画面を実装する担当になったので、改めてメモをする。

やんばるエキスパート教材 | 管理者画面(ActiveAdmin)

gemをインストールした後は、rails g active_admin:installで必要なファイルをインストールする。

続いて、モデルの管理画面を追加するコマンドを実行する。

今回の開発では、管理画面を用意したいモデルはUserTextMovieの3つだったので、以下のようにする。

rails g active_admin:resource モデル名
#=> モデル名に対応した管理画面を作成する

rails g active_admin:resource User
rails g active_admin:resource Text
rails g active_admin:resource Movie

最初は、User Text Movieのように並べてコマンドを入れてみたのだが、User.rbしか作成されなかったので、おそらく一つずつ実行する必要がある。気づいていないだけで一気に生成する方法があるかもしれない。

通常ログインしなくても管理者ログインをする

deviseを利用して、before_action :authenticate_user!で全てのページをログイン必須としていたため、以下のコードを追加した。

config/initializers/active_admin.rb

ActiceAdmin.setup do |config|
  config.skip_before_action :authenticate_user!

これで、通常ログインをしなくても管理者ログインができるようになった。

検索方法の変更

ジャンル名の検索が、数値を入れる設定になっている。

f:id:hasegawa_note:20210710142528p:plain

「等しい」「大きい」「小さい」という文章を検索する際には明らかに使わない条件に、実際に存在するジャンル名(例えばruby)で検索してもヒットしないが、数値を入れるとid番号が引っかかる。

これを、存在するジャンルから選択する形に変更したい。

一番基本的な形は、以下の形。

filter :検索したいカラム

ここに、オプションをつけることで検索条件を設定できる。

Active Admin | The administration framework for Ruby on Rails

ここを参考にすると、どのようなオプションがあるか確認できる。今回はアイテムに基づいて検索をしたいので、selectが適任。

filter :検索したいカラム, as: :オプション

# 今回はこのような形
filter :genre, as: :select

f:id:hasegawa_note:20210710143325p:plain

ちゃんと検索ボックスが変化した(プルダウンであらかじめ設定してあるものを選択もできる)。

enumファイルを使って日本語化

enums.ja.yml

ja:
  enums:
    text:
      genre: &genre
        git: 'Git'
        ruby: 'Ruby'
        rails: 'Ruby on Rails'

このファイルを使って、管理画面のenumsの部分を置き換えたい。

ccbaxy.xyz

こちらのサイトはとても参考になった。もしも今後Active Adminを利用しながら日本語化したいと思った時はまた参考にしたい。

詳細画面の日本語化を行うときも参考になった。showindexを指定して設定する。

column(:genre) do |g|
      g.genre_i18n
end

これで、enums.ja.ymlで設定したgenreの日本語(英文字だけど)を引っ張ってこられる。

が、やんばるエキスパートのテキスト教材では、もっと簡潔な書き方が紹介してあった。

enum-helpというgemを利用する。

やんばるエキスパート教材 | 列挙型(enum)とセレクトボックス

column :genre, :text, &:genre_i18n

これで先程のコードと同じ意味になる。

また、検索ボックスの部分にも適応しなければならない。

【Rails】enum_helpを用いてi18n対応セレクトボックスを作成 - Qiita

# Textの後ろのgenreを複数形に
filter :genre, as: :select, collection: Text.genres_i18n.invert.transform_values {|v| Text.genres[v] }

invertをつけて、表示名が逆にならないようにする。

transform_valuesでは、全ての値に対してブロックを呼び出した結果でハッシュのみの値を変更する。

管理画面のスタイルを他ディレクトリに移動

デフォルトの状態では、管理者画面のSCSSが他のビューにも反映されてしまうため、ActiveAdminscssjsvendorディレクトリに移動させる。

  1. vendorディレクトリ内部に、assets/javascriptsassets/stylesheetsをそれぞれ作成
  2. 作成したディレクトリに、それぞれjsscssファイルを移動させる
マイグレーションでエラー

rails g active_admin:installを実行し、必要なファイルをインストールするとマイグレーションファイルも生成される。

そのマイグレーションを実行しようとrails db:migrateを行うと、エラーが発生。

== 20210709071921 DeviseCreateAdminUsers: migrating ===========================
-- create_table(:admin_users)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DuplicateTable: ERROR:  relation "admin_users" already exists

admin_usersというテーブルはすでにありますと言われいる(ちなみに確認してみると、active_admin_commentsというテーブルもすでに作成されていた)。

自分の手違いですでに作成してしまっていたようなので、マイグレーションできない状態。

以下の方法で最終的に解決することができた。

  1. rails dbでDBに入る
  2. drop table 削除したいテーブル名;でテーブルを削除
    今回の場合はdrop table admin_users;のようにする
  3. マイグレーションを行う

学習メモ

  • find_or_create_byメソッド

Ruby on Rails レコード検索、無ければ作成 find_or_create_by メソッド - Qiita

findメソッドとcreateメソッドが合わさったメソッドであり、 引数に渡した条件に該当するレコードをテーブルから検索し 該当するレコードがあれば取得、無ければ作成してくれるメソッド。

seeds.rbファイルのサンプルユーザー作成に使われており、このメソッドを利用することでseedファイルを何度実行してもエラーが出ないようにしていると思われる。

今日のやらかし

rubocop -aの実行をつい忘れがち

commitをした後に、「あ、やり忘れた」となってしまう。

commitをするとき、自動的にやってくれるようにするべきか...。