プログラミング備忘録

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

37日目

今日の学習

Ruby on Rails

ゲストログインの実装

やんばるエキスパート教材 | ゲストログイン機能の実装

こちらを参考に、ゲストログイン機能の実装を練習。

非常に分かりやすく、手順通りに進めていくと実装することができた。

手順を丸写しするわけにはいかないので、紹介という形に留めておく。

大事だと思ったことは、実装するものに対して、いろんな角度から不備はないか、不正な利用をされないか、などを予測して、あらかじめ対策を講じること。

例えば、ゲストログインの場合は、ゲストログインアカウントのパスワードを勝手に変更されたり、アカウントを削除されたりしないようにしっかりプログラムを書いておく。

ポートフォリオを1から作る場合、その辺りの意識が抜け落ちないように注意する必要があると強く感じた。

管理者画面の作成

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

Active Adminという、管理者画面を簡単に作成できるgemを用いて管理者画面の実装を練習。

プログラムを直接いじらなくても、管理者画面を使えばサイトの情報を更新したり、削除をしたりすることが容易になる。

こちらのgemを利用すると、デフォルトのユーザーがadmin@example.comとなる。

このままにしておくのは良くないので、管理者画面にログイン出来次第、 新しい管理者ユーザーを作成し、デフォルトのユーザーは削除しておくのがセキュリティ上大切。

そして、練習でユーザーを追加するつもりが、ユーザーが追加できないので困ってしまった。

Active Admin 管理者画面からユーザー作成できない - Qiita

userテーブルのカラムを合わせても駄目だったので、解決策を検索したら同じような状況の方が記事を書いてくださっていた。

この方と同じように書き換えることで、ユーザー登録ができるようになった。

Devise - Active Adminにて作成した、管理者画面からの新規ユーザ登録ができない|teratail

こちらの方も同じ状態だったようで、

ユーザー登録用に以下の通り必要な属性をFormに表現

とあるように、この記載がないとできなかった。

参考にした記事ではpermit_paramsでカラムを指定するだけで良かったのだが、おそらく、同じカラムを持つUserモデルではなかったのでうまくいかなかったのだろう。

日本語化の手順

gemを利用すると、大抵は英語のページが出来上がるため、i18ngemを用いてラベルの日本語化を行う。

config > locales > ja.yml

ja.ymlを作成し、その中にラベルの表示をどのような日本語にするかを設定することができる。

yml形式はインデントに厳格なため、半角スペースで空白を入れるようにする。

deviseを利用している場合は、以下のコマンドでdeviseを日本語表記にすることができる。

rails g devise:i18n:locale ja

Herokuにデプロイ時エラー

作ってみた部分をとりあえずHerokuにアップロードしてみたものの、

Application error
An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details. You can do this from the Heroku CLI with the command
heroku logs --tail

と表示される(このエラー画面、ネットで見たことがあるのだが、Herokuのエラーだったのか...)。

言われた通り、heroku logs --tailと入れてみると、

at=error code=H10 desc="App crashed" method=GET path="/"...

という感じのエラー文が出てきたので、検索をしてみる。

heroku run rails cでどのようなエラーが出るか確認すると良いらしいので、実行してみると、

expected file /app/app/controllers/users/passwords_controller.rb to define constant Users::PasswordsController, but didn't (Zeitwerk::NameError)

このようなエラーが出てきた。確認してみると、Users::PasswordsControllerと書かなければならないところに全然違うControllerの名前を書いてしまっていた。他のコントローラからコピペして、Passwordsと名前を変更するのを忘れていたせいだ。

誤字を修正し、またheroku run rails cを行うも、同じエラーが出てしまう。何でだろう...と思っていたが、修正後のファイルをHerokuはおろかGitにpushすらしていなかったので当然であった。

再度git heroku pushを行い、無事にデプロイ完了!

...と思ったのも束の間、試しに機能を試してみようと思い、リンクをクリックすると、以下のようなエラーが出現。

We're sorry, but something went wrong.
If you are the application owner check the logs for more information.

rails sで見る分には問題がないのに、なぜエラーが出てしまうのだろうか。

"We're sorry, but something went wrong."のデバッグ方法【Ruby on Rails】 - Qiita

こちらの記事通りに、heroku run rake db:migrateを行うことで問題なく機能を利用することができた!

データベースにカラムを追加

titleカラムとcommentカラムしかないPostテーブルに、画像投稿のためのstring型のimageカラムを追加したい。

以下のように追加する
rails g migration Addカラム名Toテーブル名

今回はこういう書き方になる
rails g migration AddImageToPosts image:string

後から追加したカラムは、最後尾になるため自動で作成されているcreated_at、updated_atカラムの後ろにimageカラムが来るようになっているようだ。

Ruby on Railsでデータベースのテーブルにカラムを追加する方法 | よこのじ.work

after: :カラム名とすることで、指定したカラム名の後ろに順番を移動できるようなのだが、PostgreSQLではそれができないらしい。

PostgreSQLの場合、Railsのmigrationで追加するカラムの順番を制御するのは難しい - Break the brakes of the brains

Alter column position/ja - PostgreSQL wiki

上の記事やwikiを読む限り、だいぶ難易度が高いように思う...なんなら最初から他のSQLを使えばいいのではないか?

今のところ、カラムの位置を変更しないことによるデメリットがあまり分からない(もちろん、created_atなどよりは前にあった方が分かりやすいと思うが)ため、今回はこのままにしておく。

他のSQLを利用することもしてみようと思う。