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 %>
パーシャルを作ろう
小林製薬のパーシャルデント 消臭洗浄 108錠 入れ歯洗浄剤 部分入れ歯用
- メディア: ヘルスケア&ケア用品
new.html.erb
では@note
がデータベースに保存されていなかった。(これから新規に作るので)
→じゃあedit.html.erb
だったら?既存の@note
のタイトルとコンテンツを引っ張ってこないといけない。
form_for
の引数オブジェクトが既にDBに保存されている場合、create
アクションではなくupdate
アクションへのパスが自動的に設定される。
つまり、editのほうでは何か違った書き方をしなければいけないわけではない。
そのため、new.html.erb
とedit.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分