Rails Tutorialで詰まったこと(第10章ユーザーの更新・表示・削除)

本記事の目的

  • 本格的なプログラム言語学習を独学するに辺り、自分が躓いた場所を逐一残していおくことで他の独学者の皆さんの役に立つことを狙って
  • 自身の忘備録として

第10章ユーザーの更新・表示・削除

本章では8章~作成してきたログイン認証のコードを利用して、認可モデルを実装していきます。そうすることで以下のような機能が利用きるようになります。

  • user情報のedit
  • user情報のupdate
  • user情報のindex
  • user情報のdestroy(delete)

そして最後に管理ユーザーという特権クラスを導入して、ユーザー削除の権限を私、このユーザーのみに削除を許可します。

問題1. 認証と認可の違いって何?

  • 原因 : 言葉の違いがわからない
  • 対策 : 言葉の定義について調べて学ぶ

調べてみた所定義はこうなっているようです。

・認証とは、相手の身元を確認すること。
・認可とは、権限を与えること。

引用元 : Developers.IO 2017セッション「基礎からの OAuth 2.0」でお話してきました #cmdevio2017

ちなみに英語での表現についても調べてみました。

・認証(Authentication)
・認可(Authorization) 

引用元 : 【プログラマ英語】それ認証って意味じゃないですよ(厳密には)

【結論】
認証と認可は言葉こそ似ているものの言葉の意味は全く異なり、身元の確認をする認証と、その確認した身元を元に権限を与える認可という考えがあることを改めて知ることができました。
間違いやすい、ごっちゃになりやすい定義なので気になったタイミングで整理しておいてよかったです。また、英単語での違いも重要なので見つけられてよかったです。

問題2. 作成したはずのcontrollerが見つからず画面表示できない

  • 原因 : controllerのメソッドが指定するhtml.erbが別アプリの同名のものとなっていた(UsersController#edit is missing a template for request formats: text/html)

    f:id:Aizack:20220309060231p:plain
    controllerの指定するheml.erbを間違えた際のエラー

  • 対策 : お試し動画を見ながら手順を確認し、原因に気がついたため正しいアプリ内に必要なhtml.erbを作成した

【結論】
今回は凡ミスです。YassLabさんのお試し動画の質がものすごく良かったので、一瞬で間違いに気がつけました。お金溜まったら購入して2周目の概念理解に努めたいと思いました。ありがとうございました。

問題3.rails sが起動しなくなる

突然rails sコマンドを打っているとそのIPアドレスは使用中のため利用できない旨のエラーが出てきました。(Address already in use - bind(2) for "127.0.0.1" port 8080 (Errno::EADDRINUSE))
他にrailsのサーバも起動していないので困ったので、他に体験した人の情報を探し解決しました。

  • 原因 : エラーの通りIPというかポートが何かによって利用されている
  • 対策 : 別のポートを利用してrails sを起動する
$ rails s -p 3001

引用元 : rails sが通らない

【結論】
作業中に突然ポートが使用できなくなることがあるという事自体初めての経験だったので、驚きとともに上記のような回避策があることを知りました。先人の知恵には感謝ばかりです。

問題3. Strong Parametersってなんだっけ?

  • 原因 : 単語を覚えていない
  • 対策 : Railsガイドを見て定義と使いみちをお勉強

railsguides.jp

【結論】
Strong Parametersは「マスアサインメント1」という「不正リクエストによる予期しない項目(Parameters)を更新される脆弱性の防止」というセキュリティ対策で導入されたもの。更新する項目(Parameters)を厳密(Strong)に指定することで予期しない更新を受けないようにする機能。

問題4. heroku run db:seedでArgumentErrorが出てFakerでユーザを作成できない

今回もteratailやTwitterで問題を公開してみたところ様々な方から知恵をお借りできました。その中でもYasLabの安川さんに対策を共有いただけたので、そちらを以下に記載します。

  • 原因 : fakerというgemの仕様変更によりエラーが発生

    f:id:Aizack:20220309222918p:plain
    heroku run db:seed実行時のエラー

  • 対策: Gemfileのfakerを'2.20.0'というバージョンに上げる

    f:id:Aizack:20220311033355p:plain
    Gemfile内でバージョンを変更したfaker

以下の修正手順でもって、私は今回の問題を解消しました。 同様の問題にお困りの方は是非参考にしてください。

# Gemfileのfaker2.20.0に上げた後にGemfile.lockにあるfakerのバージョンを上げる
$ bundle install

# 以下からgitおよびherokuに最新のfakerを保存する
$ git add -A
$ git commit -m "Update faker version"
$ git push
$ rails test # 念の為テストも実施
$ git push heroku


# ここからDBへの投入実施
$ heroku pg:reset DATABASE
$ heroku run rails db:migrate
$ heroku run rails db:seed

【結論】
困ったときはteratail, twitter等ネットの集合知を頼ってみましょう。今回のように(前回3章時も含め)公式の方に問題を拾っていただけて、回答を得られるかもしれません。
この度、本問題について様々なお知恵を貸していただいた方々、誠にありがとうございました。