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章時も含め)公式の方に問題を拾っていただけて、回答を得られるかもしれません。
この度、本問題について様々なお知恵を貸していただいた方々、誠にありがとうございました。

Rails Tutorialで詰まったこと(第9章 発展的なログイン機構)

本記事の目的

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

第9章 発展的なログイン機構

本章ではcookiesを利用して永続的なセッションでの状態保持を実現するための実装を行った。 また、その際にセッションといcoockieを利用することができるようになるため、ユーザーのログアウトが実現できるようになった。
最後に細かいことだが、実装方法としての三項演算子を活用することでif-then文を短く記述できるようになる方法などを学んだ。

問題. 三項演算子が苦手!

他の言語にもあった三項演算子ですが、if文を短く表記するのに便利であるためよくプログラミングコンテスト等で見かけてはいたものの、正直得意ではありませんでした。
正直、初学者の自分にとっては素直にif文を書く方がわかりやすかったからです。

[if-then文]
a = 0
if a == 0
  puts 'Yes'
else
  puts 'No'


[三項演算子]
a == 0 ? puts 'Yes' : puts 'No'

【結論】
まずはシンプルなものを書いてみましたが、三項演算子には記述が短くなる上に見やすくなる利点がありました。自分が見てきたプロコンの記述が速度や計算量に最適化されたりしていて自分のレベルには合っていないだけだったようです。
言ってみれば食わず嫌いですね。書いてみると案外理解できるものです。

Rails Tutorialで詰まったこと(第8章 基本的なログイン機構)

本記事の目的

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

第8章 基本的なログイン機構

本章では基本的なログイン機構としてsessionやcookieを利用した状態保持を実装します。その中でログインの状態に応じたページ表示等を行えるよう学びました。
また、引き続きテスト駆動開発や統合テストを行いルーティング・データベース・レイアウト変更の確認を行っています。

問題1.GREENになるはずのテストが何時まで経ってもREDのまま

  • 原因 : rails generate した際のcontroller名が間違っていた
[私が打ったコマンド]
$ rails generate controller Session new

[本来打つべきコマンド]
$ rails generate controller Sessions new
  • 対策 : rails destroy を行い、正しいcontroller名で再generate
[修正用コマンド]
$ rails destroy controller Session

$ rails generate controller Sessions new

【結論】
1周目なので打つコマンドはよく読んで、できる限りコピーアンドペーストで対応しましょう。

問題2.Cloud9が一時的に開かなくなった

  • 原因 : 急激にインストール等の内容を行ったためディスク容量を圧迫し重たくなってしまった可能性あり
  • 対策 : 序盤に習ったディスク拡張コマンドを打つ(ただし、間に6時間開ける必要あり)
[ディスク拡張コマンド]
$ source <(curl -sL https://cdn.learnenough.com/resize)

f:id:Aizack:20220307225623p:plain
6時間あけずに複数回拡張コマンドを打った時のエラー

f:id:Aizack:20220308172117p:plain
コマンドが実行成功した時の反応

【結論】
上記コマンドを毎章の開始ごとに打つ。

Rails Tutorialで詰まったこと(第7章 ユーザー登録)

本記事の目的

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

第7章 ユーザー登録

本章では、6章で実装したDBとデータのバリデーションを利用したユーザ登録画面を作成しました。その際にはrailsに存在する開発・テスト・本番の3環境を活かしつつ、統合テスト・SSLPumaの導入等を行いました。

SSLとPumaについては、私自身あまり理解できていなかったので正確な情報元より引用し、それを整理しました。 以下がその引用になります。

  • SSLについて
    • 引用 : 国民のための情報セキュリティサイト1
SSL(Secure Socket Layer)とは、データを暗号化して送受信する仕組みのひとつです。
(中略)
個人に関する情報を取り扱うWebサイトで、これらの情報を盗み取られるのを防止するため広く利用されています。
  • Pumaについて
    • 引用: rails tutorial 7.5.2本番環境用のWebサーバ2
Pumaは多数のリクエストを捌くことに適したRuby/Rackアプリケーション用のサーバーです。

所感

今回は分量に圧倒されたものの、わからないことを1つ1つ丁寧に調べていけば引っかかることも少ない単元でした。そのため普段書いている「詰まったこと」はありません。
とはいえ、上記のSSLのような知っているつもりでもよくわからない単語やPumaのように初めて聞くWebサーバの名前等の専門用語が飛び交うようになり、本格的なWebアプリケーション作成に入ったのだとワクワクしてきました。(同時に難易度と分量でくらくらしています笑)

この章まできたら一応は半分の単元が終了となります。ここから14章までで更に複雑で重要なアプリケーション作成のコツを学ぶことになると思うと感慨もひとしおですが、浸ってばかりでもいられません。
なんとか食らいついて14章まで独学で完走してみようと思います。

Rails Tutorialで詰まったこと(第6章 ユーザーのモデルを作成する)

本記事の目的

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

第6章 ユーザーのモデルを作成する

問題. DBのトランザクション中にmigrationを行いデットロック1発生

  • 原因 : rails consoleのsandboxでDB実行中(右オレンジ枠部)にDBのmigration(左赤枠部)を実行したこと(下記、図1参照)
  • 解決策 : 速やかにsandboxを閉じrollback後にmigration実行

f:id:Aizack:20220302211459p:plain
図1. sandboxでDB起動中に db migrateコマンドを実行

【結論】
自分が今なにを対象に作業しているのかを各コンソールやIDEの画面を把握していくことで今回のような問題の発生は防げた気がする。
一方でrails console --sandboxの状態での状態変更がロールバックされていない時にmigrationするとデットロックが発生するという事を体感できたのは興味深かった。


  1. 複数のプログラムが実行された際に矛盾が発生したため、お互いを待つ状態になり処理が進まなくなること。今回はデータベースの変更途中にmigrationを実行したことが原因。

Rails Tutorialで詰まったこと(第5章 レイアウトを作成する)

本記事の目的

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

第5章 レイアウトを作成する

この章ではHTML, CSSなどのデザインを3~4章で作成したサンプルに当てました。
Railsのパーシャル機能・Bootstrap・Sass等を駆使しつつ、コードとともにサイトも洗練させていきました。また、前の章でも触れたテストについても更に上位の統合テストを実施することでテストのレベルも上がってきています。

問題. Sassわからない問題

元々フロントエンドに詳しくない上にCSSの上位概念のような形で突然出てきたSassに困惑、一旦手が止まりました。

  • 原因 : Sassって何状態でテキストを読み進めたこと
  • 対策 : 一旦ProgateのSassコースに少し触れて、Sassとはどういうものか雰囲気を把握した上でテキストの続きに入った

prog-8.com

【結論】
知らない用語が出てきたら一旦立ち止まって調べてみよう。本文の内容を深く理解できる可能性が出てくるかもしれない。

Rails Tutorialで詰まったこと(第4章 Rails風味のRuby)

本記事の目的

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

第4章 Rails風味のRuby

この章では基本的なRubyの文法や構文、そしてそれをRailsでどのように利用しているのかを書かれ、学ぶ構成になってます。
数値の計算・文字列操作・配列・ハッシュ・シンボルといった基本からRubyのメソッド・クラスがどのようにRailsに組み込まれ、便利に利用可能になっているのかを知ることができました。

問題1. 範囲(range)と配列を組み合わせた使い方への困惑

  • 原因 : Rubyの範囲(range)の記法と文字列の組み合わせという問題を見て冷静さを失った。(これまでの演習は数値中心だったため)
  • 対策 : 何度もテキストを読み直して、文字列の場合はクォーテーションが必須という事を思い出した。

下記はrangeと配列化の組み合わせ例(数字/文字列)

# 数値のrange
0..10

# 数値のrangeを配列化
(0..10).to_a

# 文字列のrange
"a".."g"

# 文字列のrangeを配列化
("a".."g").to_a

【結論/感想】
Rubyで初めて触れた記法、範囲(range)に戸惑いました。中々演習問題が解くことができず他に比べると時間がかかりました。

問題2. ハッシュとシンボルの使い分けの理解に時間がかかる

  • 原因 : シンボルはRuby独自で発展した記法のため、他の言語(PHPPythonJava)等にしか触れていない自分にとっては新鮮過ぎて使いみちを迷った
  • 対策 : とにかく書いて慣れる。演習問題やテキストの説明を読みながら迷ったら戻る、そして読み直すを繰り返すことで理解を深めた
# ハッシュ(他の言語で言う連想配列)
user1 = { "last_name" = "Mark", "first_name" = "Robson"  }

# シンボル記法1(PHPのアロー関数に似てるけど不思議)
user2 = { :last_name => "Jonathan", :first_name => "Robson"  }

# シンボル記法2(こっちはJSONっぽい?)
user3 = { last_name: "Bob", :first_name: "Robson"  }

# シンボル記法2と3は等価(これにも驚き)
user2 = user3
> true

【結論/感想】 シンボル記法の書き方には戸惑いました。若干書き方がPHPのアロー関数っぽいですが、コロン(:)をつけて配列のKeyとするやり方、そしてJSONのように後ろにコロン(:)をつける書き方等色々あることを知りました。