Ruby on Rails Ⅴ 3章 ユーザー認証を仕上げよう - コントローラでヘルパーを使おう
201703014@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
目次
コントローラでヘルパーを使おう
Userと同じように、Noteでも自分が作成した投稿だけを編集できるようにする。
UserとNoteの認証は同じ方法なので、ヘルパーを定義してDRYに。
コントローラ内でヘルパーを使えるようにするには、ヘルパーファイルをincludeする。
やりたいことは理解できるものの、まだしっくりきてない感。
今回の勉強時間:15分 累計勉強時間:12時間47分
Ruby on Rails Ⅴ 3章 ユーザー認証を仕上げよう - プロフィールの編集を制限しよう
201703013@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
目次
プロフィールの編集を制限しよう
現状だと他人のプロフィールも編集できてしまうので、自分のプロフィールしか編集できないようにする。
<% if current_user.id == @user.id %>
で、条件に合うときだけ「プロフィール編集」リンクが表示されれば良い。
ただし、これだけだと他人の編集ページのURLを直打ちするとアクセスできてしまうので、before_action
を使って、アクション実行前にuser同士を比較する。
今日はつかれたので少なめで。。
今回の勉強時間:10分 累計勉強時間:12時間32分
Ruby on Rails Ⅴ 2章 deviseを活用しよう
201703012@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
目次
ログイン必須ページをつくろう
未ログインユーザがnotesコントローラのnewアクションなどにアクセスしようとしたときに、ログインページにリダイレクトさせる。
コントローラで`before_action :authenticate_user!```すると、そのコントローラの全アクションへのアクセスを、ログイン済ユーザに制限できる。
また、deviseではフラッシュメッセージを自動生成してくれる。
ログイン前後で表示を切り替えよう
ログイン前後でヘッダーの表示を切り替えつつ、deviseで生成されるルーティングを学習しよう。
current_userヘルパー
よく使う。
deviseの処理を見てみよう
パスワードは暗号化されてusersテーブルのencrypted_passwordカラムに保存される。
rails console > User.last
で「確かに暗号化されてるねぇ」でレッスン終了。
deviseをカスタマイズしよう
deviseのビューをカスタマイズするには、rails g devise:views
でカスタマイズ用のビューファイルを生成する必要がある。
deviseとコントローラを使いわけよう
このままだとdeviseの新規登録画面と、Ⅳでscaffold使って作った新規登録画面が両方存在していて良くない。deviseの新規登録画面のみ使うよう、不要なアクションを消していく。
resourcesで生成されるルーティングを制限
routes.rb
のresourcesの第二引数に「only」を使うと、生成するルーティングを制限することができる。(最初から要らないものは作らない、ということ?)
それはわかったものの、作る時の設計とか大変そう。
今回の勉強時間:40分 累計勉強時間:12時間22分
Ruby on Rails Ⅴ 1章 deviseを準備しよう
201703012@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
目次
インフルで1週間近く寝込んでいたので、久しぶりの勉強ログ。
この章ではユーザのログイン機能を作成する。
deviseをインストールしよう
ログイン機能を簡単に実装できるgemを導入する。それがdevise.
参考:Home · plataformatec/devise Wiki
今回のレッスンでは基本的なログイン機能を作成する。
他にも
- パスワードリセット機能
- Twitter / Facebookログイン機能
なども簡単に作れるらしい。へー。
やり方
- Gemfileに
gem 'devise'
を書き込む bundle install
rails g devise:install
Userモデルにログイン機能をつけよう
ログイン機能はUserモデルを用いて実装。
rails g devise User
コマンドを実行すると、Userモデルでdeviseの機能が使えるようになる。(models/user.rbに自動で変更が加わる)
他にも、上記コマンドで
- 新規登録画面
- ログイン画面
が自動生成される。ルーティングも自動生成されるので、ページが表示できる。
コマンドを打ったところ、
~ $ rails g devise User invoke active_record create db/migrate/20170311151727_add_devise_to_users.rb insert app/models/user.rb route devise_for :users
のように、変更点が表示された。
このあとは指示に従って各ファイルを変更。ここは覚えるところというよりは、このあとのための下処理的位置付けなので特別難しいことはなく。
病み上がりなのでここまで。
今回の勉強時間:15分 累計勉強時間:11時間42分
Ruby on Rails Ⅳ 4章 プロフィール画像を表示しよう
20170305@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
目次
画像を表示しよう
ゴールは、ユーザがプロフィール画像を登録して、ユーザのページで表示できるようになること。
image_tag
画像を表示するにはimage_tag
ヘルパーを使う。画像ファイル名を指定すると、app/assets/images
の中にある画像を表示しれくれる。
→さらにフォルダを分けたりしたら、どうなる?
画像を保存する準備をしよう
ユーザごとにプロフィール画像を登録できるよう、userテーブルにimageカラムを追加する。
画像はpublicフォルダを作ってそちらに保存する。
画像をアップロードするしくみ
file_field
ヘルパーを使う。よく見る「ファイルを選択」ボタンの付いているアレが実現できる。
画像を保存しよう
スライドが「コードはこうです。」でさらっと流れてしまった。。
インスタンスメソッドを定義しよう
画像を保存するコードを、createでもupdateでも使いたいので、インスタンスメソッドとして定義する。
ここで「あれ?コードを使いまわしたいときに使うのはパーシャルじゃなかったの?」という疑問が出そう。
- パーシャル:ビューファイルのコードの一部分を抜き出したもの
- インスタンスメソッド:そのインスタンスに対していろんな場所で使いたい共通処理だから、モデルの中でメソッドとして定義すればいい
かと。
(こういう点を頭でわかったつもりで放置しないで、後輩に説明できるレベルで理解するのが大事な気がした)
プロフィール画像を表示しよう
ユーザ一覧で、画像を登録しているユーザはその画像を、登録していないユーザはデフォルト画像を表示する。
ヘルパーを作る
ユーザが画像を登録しているかどうかで出し分ける部分のコード、毎回書くのは面倒。
画像表示は複数箇所で行いたいので、ビューで使う画像表示部分のコードをヘルパーにまとめる。
※「何度も使うコードは一つにまとめる」という目的を果たすために、パーシャルなのかインスタンスメソッドなのかヘルパーなのか、説明が欲しいところ。 端折ってるけど、多分説明必要。
今回作ったimage_for
が受け取るのはユーザーオブジェクト。途中まで間違えてimageを受け取ろうとしていた。
今回の勉強時間:43分 累計勉強時間:11時間27分
Ruby on Rails Ⅳ 3章 renderを使いこなそう
20170305@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
目次
パーシャルにオブジェクトを渡そう
まず「パーシャルってなんだっけ?」を思い出す。
Ruby on Rails Ⅲ 2章 scaffoldのコードに近付けよう(2) - 10000hの技術メモ
共通するコードをパーシャルにまとめておいて、別の場所から呼び出せる。そうなると当然、パラメータを渡したくなる。
パーシャルへのオブジェクトの渡し方
<% @notes.each do |note| %> <%= render 'notes/note', note: note %> <%end %>
noteという単語がたくさん出てくるので、どのnoteが何を表しているのか意識しましょう。
↑確かに初見だからかものすごく困ってます(もっとわかりやすく名前変えるというのはできないんでしょうか・・・)
renderの特殊な使い方
- 配列のrender
※これ要復習。
今回の勉強時間:15分 累計勉強時間:10時間44分
Ruby on Rails Ⅳ 2章 ユーザーと投稿を結びつけよう
20170305@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
目次
migration
ユーザーと投稿を結びつけたい。ユーザーはidを持っているので、notes
テーブルにuser_id
カラムがあれば判別できるはず。
migrationとは
データベースのテーブルやカラムなどの構造を変更できる仕組み
rails g migration add_user_id_to_notes user_id:integer
を実行すると、migrationファイルが生成される。
上の例だと、user_id
カラムをnotes
テーブルに追加する、というmigrationファイルが自動生成される。
ファイル名自体は任意なので、このフォーマットに従わずに作ることも可能。
rake db:migrate
rake db:migrate
を実行すると、migrationファイルの中身をDBに反映できる。
いままで実行していたのは、rails g model
やrails g scaffolr
で自動生成されたmigrationファイルをDBに反映するためだった。
user_idを保存しよう
フォームでnoteを作成する際に、user_idも一緒に入力・送信できるようにする。
note作成時にuser_idを必須にするよう、コントロールを変更。ストロングパラメータを思い出す。バリデーションも。
ユーザーの投稿一覧を表示しよう
userのshowページに、そのuserの投稿一覧を表示する。
whereメソッド
@notes = Note.where(user_id: @user.id)
一対多
has_many
とbelongs_to
(※これ便利だけどちゃんと理解しないといけないやつだ。他のも読んで理解)
一対多もそうだし、ファイル間のデータの受け渡しがまだまだ難しい。@付け忘れたりする。
今回の勉強時間:35分 累計勉強時間:10時間29分 (10時間突破!)