63日目
今日の学習
Ruby on Rails
共同開発
共同開発が徐々に進んでいる。他の方が行った作業をチェックしたり、他の方の作業が終わった後にやるべきタスクをやったりと、一人ではなかなか経験できないことが多い。
他の方の作業が終わった後に取り掛かる作業に関するメモ。
develop
ブランチに移動git pull origin HEAD
で最新の状態にするbundle install
を実行yarn install --check-files
を実行rails db:migrate
を実行- 次の作業へ
プルリク確認時にエラー
他の方が行ったプルリクをローカルで確認する方法。
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
で必要なファイルをインストールする。
続いて、モデルの管理画面を追加するコマンドを実行する。
今回の開発では、管理画面を用意したいモデルはUser
、Text
、Movie
の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!
これで、通常ログインをしなくても管理者ログインができるようになった。
検索方法の変更
ジャンル名の検索が、数値を入れる設定になっている。
「等しい」「大きい」「小さい」という文章を検索する際には明らかに使わない条件に、実際に存在するジャンル名(例えばruby)で検索してもヒットしないが、数値を入れるとid番号が引っかかる。
これを、存在するジャンルから選択する形に変更したい。
一番基本的な形は、以下の形。
filter :検索したいカラム
ここに、オプションをつけることで検索条件を設定できる。
Active Admin | The administration framework for Ruby on Rails
ここを参考にすると、どのようなオプションがあるか確認できる。今回はアイテムに基づいて検索をしたいので、select
が適任。
filter :検索したいカラム, as: :オプション # 今回はこのような形 filter :genre, as: :select
ちゃんと検索ボックスが変化した(プルダウンであらかじめ設定してあるものを選択もできる)。
enumファイルを使って日本語化
enums.ja.yml
ja: enums: text: genre: &genre git: 'Git' ruby: 'Ruby' rails: 'Ruby on Rails'
このファイルを使って、管理画面のenumsの部分を置き換えたい。
こちらのサイトはとても参考になった。もしも今後Active Admin
を利用しながら日本語化したいと思った時はまた参考にしたい。
詳細画面の日本語化を行うときも参考になった。show
やindex
を指定して設定する。
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が他のビューにも反映されてしまうため、ActiveAdmin
のscss
とjs
をvendor
ディレクトリに移動させる。
マイグレーションでエラー
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
というテーブルもすでに作成されていた)。
自分の手違いですでに作成してしまっていたようなので、マイグレーションできない状態。
以下の方法で最終的に解決することができた。
rails db
でDBに入るdrop table 削除したいテーブル名;
でテーブルを削除
今回の場合はdrop table admin_users;
のようにする- マイグレーションを行う
学習メモ
find_or_create_by
メソッド
Ruby on Rails レコード検索、無ければ作成 find_or_create_by メソッド - Qiita
findメソッドとcreateメソッドが合わさったメソッドであり、 引数に渡した条件に該当するレコードをテーブルから検索し 該当するレコードがあれば取得、無ければ作成してくれるメソッド。
seeds.rb
ファイルのサンプルユーザー作成に使われており、このメソッドを利用することでseedファイルを何度実行してもエラーが出ないようにしていると思われる。
今日のやらかし
rubocop -aの実行をつい忘れがち
commitをした後に、「あ、やり忘れた」となってしまう。
commitをするとき、自動的にやってくれるようにするべきか...。