Ruby on Rails チュートリアル やってみてる ~9章~

お久しぶり過ぎます。
私生活でいろいろあったり、別の案件をやっていたり、体調を壊したり、やる気が出なかったりで時間が空いてしまいました。

今回は9章です。RoRチュートリアルもゴールがそこまで来てしまいました。
9章は登録したユーザーのデータを更新したり閲覧したり、また削除したりするという内容でした。

ボリュームもなかなかでした。時間的には3,4日くらいでしたか。
ただ内容は、アカウントを扱うサービスの中身が知れる感じなので結構面白い。なので4日くらい掛けてゆっくりやってみるとそんなに苦では無いかと思います。

あと、今回も謎のエラーが出まくったので、9章開始時点での状態をgithubにpushしておいてください
8章の記事にgithubのcommitの状態に戻して作業をやり直す手順を載せてますので、どうにもならなくなったらそちらを参考にやり直してみてください。

それではいってみましょう。

 

9章の概要

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

タイトルの通りです。
前回まででユーザーの登録からサインイン、サインアウトまでを実装したので、今回はユーザーの情報を編集したり、閲覧したり、退会させてしまったりする機能の実装でした。

この章では個人情報を扱ったり、データを操作する機能を扱うため、それぞれの機能をセキュアに実装していっています。そのため少し手間だなと感じるかもしれません。

編集ではプロフィール画像の編集もありますが、こちらはGravatarというサービスにあやかっています。便利ですね。
編集するフォームには既に登録してある情報が入力されている状態になっていて、これはRailsの機能だそうです。これまた便利ですね。

 

ユーザー登録時と同じように編集時にもバリデーションによって不適切な内容の場合は失敗させる必要があります。エラーメッセージの表示も含めてテストを書いて実装していきます。

 

編集失敗の実装が終わったら、編集の成功を実装していきます。
CRUDでいうと作成がCreateですが、編集はUpdateですね。編集の実装は作成の時のコードとほぼ同じ内容の箇所もありました。
自分自身の情報を更新するためにはその都度パスワードを入力する必要があります。プロフィール編集画面を開いたまま離席した人の情報を他人がこっそり変更してしまうといったことを防ぐことができますね。

 

自分自身の情報を変更することができるのは当然ですが、他人が自分の情報を変更できてしまうのはまずいですよね。
そのため、サインインを必ずさせ、サインインしているユーザー以外のページにアクセスした場合にはサインイン画面にリダイレクトさせるという機能を実装します。

 

また、ここで始めて聴く言葉が出てきました。「フレンドリーフォワーディング」です。
アクセス権の無いページに行こうとした際に問答無用にどこかへリダイレクトさせるのではなく、一度サインインページに遷移させ、アクセスできるID/PASSを入力すれば行こうとしていたページを表示させてあげるという機能です。
こういう設計になっているサービスはよく見ていましたが、それに名前が付いていたのだなぁと関心してしまいました。

 

そして全てのユーザーを一覧で表示させる機能を実装します。
せっかく一覧表示できる機能を実装したのに、登録しているユーザーが少ないと寂しい見た目になってしまうので、Faker gemというものを使って、それっぽい名前とメールアドレスをランダムで登録させていきます。便利ですね。
更にその一覧画面がとても縦長になってしまうのでページングを実装するのですが、これもRailsの持つ機能を使って簡単に実装することができます。すげえよRails。。。

 

ユーザーの更新、一覧表示を実装したら今度は削除させる機能の実装です。RESTで唯一使っていなかったdestroyですね。
ただし、全てのユーザーが他人を削除できてしまうとそのサービスはめちゃくちゃになってしまいます。そのため、管理者というスーパーユーザーを作り、その管理者だけがユーザーの削除を行うことができるようにします。管理者のみに「削除」リンクを表示させるようにし、他のユーザーには表示させないように実装します。
また、演習では管理者自身が自分を削除できないようにします。管理者がいなくなったらそのシステムでユーザーを削除できる人がいなくなってしまいますよね。そのためでしょう。

 

といった内容でした。ボリュームがありそうですが、興味深いんじゃないでしょうか。

 

ハマったところ

今回もハマりました。ハマりまくりました。何度もgit cloneで環境を作り直しました
この演習を始める前に是非僕のハマったところに目を通していただければと・・・。

 

9,1,2 と リスト9.19 でテストが通らなくなる

9,1,2 と リスト9.19 でなぜかテストが通らなくなります。書いてある通りにやってるのに。なぜか通りません。
原因は8章で"form_tag"の際にsession_controler に"[:session]"を追加したためでした。これを消せば通るようになりました。解決。

参考:

RSPEC erros on Chapter 9 of Ruby Tutorial - Stack Overflow

Rails研修(9月2日).md 

 

herokuへのpushでエラーが起きるようになった

8章でもherokuで謎のエラーが出るようになって困ったんだけど、今回は別のエラーが出た。

Permission denied (publickey).
fatal: The remote end hung up unexpectedly

で、調べたところ以下を試したら解決。

参考:

 id_rsaのパスワードを入力してください。 - Re:Start

 

更にherokuで謎のWARNINGが出る。

WARNING: Destructive Action
! This command will affect the app: [サービス名]
! To proceed, type "[サービス名]" or re-run this command with --confirm [サービス名]

 以下の「バックアップからリストア」を試したら解決。

参考:

 Heroku データベースの管理 - 君の瞳はまるでルビー - Ruby 関連まとめサイト

 

演習

まず、この章の演習の状態を残していると10章でエラーが出るようです。

参考:

Railsチュートリアル第9章の演習を先にやると第10章で詰まった - ネット偽善者でもいいじゃない

演習に入る前にちゃんとgitであれこれしておいてくださいね。
そして演習が終わったら上記の箇所は元に戻しておきましょう。

 

演習6は、users controller.rbにサインインしている場合にはルートにリダイレクトするというif文を追加します。後は調べて自分でやってみてくださいね。

演習7は、7.1を参考にviewのファイルの一つに request.url などのリクエストメソッドを挿入してブラウザで確認すれば良いのではと。 <%= request.url %>の場合はURLが表示されます。

他の箇所でわからないところがあれば過去にRailsチュートリアルを行った人のソースがゴロゴロ転がってるので探してみてくださいね。

 

感想など

今回もタイポに泣かされました。。
どこが間違ってるかわからないという時はgithubなどで過去にRailsチュートリアルを終わらせている方のソースと自分のソースをdiffってみるといいですよ。以下はWEB上でdiffができるやーつ。

Mergely - Diff online, merge documents

実は演習までは1ヶ月以上前に終わっていたんですが、本当にいろいろあってこんなに間が空いてしまいました。。挫折したんじゃねーの?なんて思われてたら申し訳ないです。

しかし、残り2章で終わりですので、自分のペースで必ず完走し、次の段階に進もうと思います。

RoRチュートリアルの中の人であるID:yasulabsさんにチュートリアルを完走し終えた後にどうすれば良いかという質問をしたところ以下のように助言をいただきました。

実践的な力を身につけたいのであれば、やはり何か作ってみたいウェブサービスを考えて (アイデアがなければ何かのサービスのコピーでも良いと思うので) それを練習として作ってみるのが一番よいかなと思います。実践するための考え方や技術はチュートリアルで身に付いているはずなので、あとは実践してみるのが一番ですね :)

他の読者の方が制作したウェブサービスは下記URLにまとめているので、参考にしてみてください。

http://b.hatena.ne.jp/yasulabs/%E6%88%90%E6%9E%9C%E7%89%A9/

ただし、実装を進めていくにつれて、RailsチュートリアルやRailsガイドの内容だけでは分からないこともあると思うので、そういった場合にはウェブ上の記事や紙の書籍などを読み込む必要があるかなと思います。

それと、Ruby/Railsに関するコミュニティが至る所にあるので、そういったコミュニティに顔を出してみても面白いかもしれませんね :)

地域Rubyの会
https://github.com/ruby-no-kai/official/wiki/RegionalRubyistMeetUp

誰かと進捗を共有しながら作っていくとモチベーションも途切れにくいので、オススメです :D

 yasulabsさん本当にありがとうございます。

僕的には以前から興味を持っていたクローラーの開発を行ってみたいと考えています。まだほとんど写経しかできない状態ですので、初心者向けのWEBサイト、または本などを参考にやっていきたいと思っています。

以下は読んでみようと思っています。

 

はい、というわけでこのシリーズも残り2回。
第10章は「ユーザーのマイクロポスト」だそうです。掲示板的なやつを作っていくんでしょうか。
ではまた。あまり時間が開かないように気をつけます。

 

ゴーゴーナナニーサンニーレー

www.youtube.com

 

Ruby on Rails チュートリアル やってみてるシリーズ:

はじめに

第1章 ゼロからデプロイまで

第2章デモアプリケーション

第3章ほぼ静的なページの作成

第4章 Rails風味のRuby

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

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

第7章ユーザー登録

第8章サインイン、サインアウト

広告を非表示にする