10000hの技術メモ

この先生きのこるための勉強内容&時間記録

Ruby on Rails Ⅳ 1章 ユーザーをscaffoldしよう

20170304@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

目次

ユーザーをscaffoldしよう

(scafflodする、は動詞なんだ・・・。)

ユーザを作成する

$ rails g scaffold User name:string email:string

$ rake db:migrate

ユーザを作ったら、あとはユーザーページを作ったりログイン機能つけたりログイン時のバリデーションとかするんだろうな、とこの時点で想像。

これだけでユーザの追加・編集・削除が出来るように。確かにscaffold便利。

ユーザーのバリデーション

name, emailの値が存在する場合に保存するようにする。

また、uniquenessを使って、同じメールアドレスのユーザが登録されないようにする。

validates :name, presence: true
validates :email, presence: true, uniqueness: true

短いけどキリが良いのでここまで。

今回の勉強時間:10分 累計勉強時間:9時間54分

Ruby on Rails Ⅲ 2章 scaffoldのコードに近付けよう(2)

20170303@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

目次

form_for

form_forヘルパーを使うと、form_tagヘルパーを使うときと比べてより簡単に作ることができる・・・?

form_forの書き方は

<%= form_for(インスタンス) do |f| %>

<% end %>

fのところは、こう書く。

form_forの中身を書こう

`form_forの中身のフォームも、ヘルパーで簡単に書けるらしい。

例えば

<%= form_for(@note) do |f| %>
  タイトル
  <%= f.text_field :title, class: "form-control" %>
  内容
  <%= f.text_area :content, class: "form-control" %>
  <%= f.submit "保存", class: "btn" %>
<% end %>

パーシャルを作ろう

↑ではなく。

new.html.erbでは@noteがデータベースに保存されていなかった。(これから新規に作るので)

→じゃあedit.html.erbだったら?既存の@noteのタイトルとコンテンツを引っ張ってこないといけない。

form_forの引数オブジェクトが既にDBに保存されている場合、createアクションではなくupdateアクションへのパスが自動的に設定される。

つまり、editのほうでは何か違った書き方をしなければいけないわけではない。

そのため、new.html.erbedit.html.erbのコードのうち、form_forの部分が全く一緒になる。それならまとめたい。

そこでパーシャル

ビューファイルのコードの重複を取り除いたり、見やすくしたりするために、コードの一部分を抜き出したファイルのことを「パーシャル」と呼びます。

なるほど。

  • パーシャルのファイル名はアンダーバーから始まる。
  • パーシャルはrenderメソッドでrender 'フォルダ名/パーシャル名'で。

updateメソッド

フォームの送信先のupdateアクション、scaffoldで生成されたほうはupdateメソッドを使っている。

updateメソッドは

update(title: 値, content: 値)

のように、引数にハッシュをとることができる。

クリアー。

今回の勉強時間:45分 累計勉強時間:9時間44分

Ruby on Rails Ⅲ 2章 scaffoldのコードに近付けよう(1)〜サクセスメッセージを表示しよう

20170302@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

目次

サクセスメッセージを表示しよう

投稿が成功したらメッセージを出す。

やり方は、redirect_toの第二引数にnoticeを指定する。

ということは、notice以外にも色々あるんだろうなーと思い、さらっとググる。

まだやれるけど、章が終わってキリがいいのでココまで。

今回の勉強時間:7分 累計勉強時間:8時間59分(おしい!!)

Ruby on Rails Ⅲ 2章 scaffoldのコードに近付けよう(1)〜フォームに初期値を入れよう - エラーメッセージを表示しよう

20170301@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

目次

フォームに初期値を入れよう

前にやった気もするけれども、今回は「バリデーションチェックを通らなかったときに、さっき入力していた値をフォームに入れておこう」という趣旨。

saveに失敗した時の初期値

createアクションで@noteに値がセットされているので、@note.titleで初期値を表示できる。

newアクションを経由した場合の初期値

newアクションで中身が空の@noteを定義する

・・・演習がコピペで終わった

エラーメッセージを表示しよう

何がダメでやり直しさせられてるのか、ユーザにお知らせしたい。

バリデーション失敗時、エラーメッセージは同時に作られる。(!)

内容は @note.errors.full_messagesに入っている。

取得の仕方

<% @note.errors.full_messages.each do |message | %>
<%= message %>

こんな感じ。

full_messages以外のメソッドはどんなのがあるの?という疑問が出て少し調べたのでメモ。

参考:Active Record バリデーション | Rails ガイド

「エラーが一つでもあれば表示する」の書き方

<% if @note.errors.any? %>

<% end %>

エラーメッセージを出すと、「なんかそれっぽいものが出来てきた」という気になれるので良い感じ。 見た目もbootstrapで綺麗だし。

今回の勉強時間:16分 累計勉強時間:8時間52分

Ruby on Rails Ⅲ 2章 scaffoldのコードに近付けよう(1)〜バリデーションをかけよう - render

20170228@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

目次

バリデーションをかけよう

テストエンジニアとしては気になるところ。

ユーザの入力値をチェックする。空でないかどうかなど。

バリデーションはモデルで設計する。

validates :title, presence: true
validates :content, presence: true, length: { maximum: 140 }

render〜ビューを出力しよう〜

バリデーションの結果によって処理を変える。

パスの省略

redirect_to note_path(@note.id)

これを

redirect_to note_path(@note)

こうして

redirect_to @note

こうじゃ

render

renderメソッドを使うと、指定したビューファイルをブラウザに表示する。

バリデーションで失敗したら、もう一度new.html.erbを出せる。

render :new

今回の勉強時間:21分 累計勉強時間:8時間36分

Ruby on Rails Ⅲ 2章 scaffoldのコードに近付けよう(1)〜セッターを省略しよう・ストロングパラメータ

20170226@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

目次

セッターを省略しよう

scaffoldで作ったコードではセッターが使われていない、なぜか。

→newメソッドの引数にハッシュを取っているから。

@note = Note.new(title: params[:title], content: params[:content])

といった具合。

ストロングパラメータ

↑でセッターを省略できたはいいが、titleとかcontentとかをそれぞれセットするのはめんどくさい。まとめて受け取って、まとめてセットできるほうが嬉しい。

悪いやり方

<input name = "note[title]">
<textarea name = "note[content]">

に変更して、コントローラは

@note = Note.new(params[:note:)

で受け取る。

これだとどんな値でもセットできてしまい、セキュリティ的に禁止されている。

そこでストロングパラメータ。

ストロングパラメータの使い方

params.require(paramsのキー).permit(保存を許可するカラム1,  保存を許可するカラム2, ...)

今回の勉強時間:20分 累計勉強時間:8時間15分

Ruby on Rails Ⅲ 2章 scaffoldのコードに近付けよう(1)〜before_action

20170225@home Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

目次

before_action

scaffoldで作られたコントローラから学ぶ。

scaffoldで作られたコントローラ内のアクションで、

@note = Note.find(params[:id])

が無く、いきなり@noteを使っている。なぜこんなことができるのかを解説。

各アクションで同じように@noteを定義していると重複なので、一つのメソッドset_noteにまとめる。

def set_note
  @note = Note.find(params[:id])
end

これを、

before_action:set_note

で呼び出すと、全てのアクションの最初でset_noteが呼ばれる。

「全てだとちょっと・・・」というときには

before_action:set_note, only: [:show, :edit. :update, :destroy]

set_noteはprivateで定義する。

明日も仕事なので、今日は少しで。

今回の勉強時間:12分 累計勉強時間:7時間55分