バリデーション
- Validation=検証
- 不正なデータがデータベースに保存されないように、データをチェックする仕組みのことをバリデーションと言う
- バリデーションに引っかかった場合(不正なデータの場合)にはデータベースに保存されない
- モデルで設定する。
- バリデーションを設定してそれに引っかかった場合、saveメソッドを用いて保存しようとしても、保存が失敗するようになる
presence
そのカラムの値が存在するかどうかをチェックすることができる
class Post < ApplicationRecord validates :content,{presence : true} end
length
文字数を制限する
class Post < ApplicationRecord validates :content, {presence: true,length:{maximum:140}} end
saveの戻り値によってリダイレクト先を変える
saveされた際に.saveがtrueになることを利用して条件式を作る
def update @post = Post.find_by(id: params[:id]) @post.content = params[:content] if @post.save redirect_to("/posts/index") else redirect_to("/posts/#{@post.id}/edit") end end
render(糞ムズい)
- renderとは(英辞郎より)・・・1〔人・物を~の〕状態にする 2〔義務として~を〕与える、提供する、提出する
- renderメソッドを用いることで、別のアクションを経由せずに、直接ビューを表示することができる
- render("フォルダ名/ファイル名")のように表示したいビューを指定
- renderメソッドを使うと、redirect_toメソッドを使った場合と違い、そのアクション内で定義した@変数をビューでそのまま使うことができる
- redirect_toメソッドとrenderメソッドの書き方が間違えやすい。redirect_toはURLを指定して「redirect_to(URL)」のように書く。一方renderはビューファイルを指定して「render("フォルダ名/ファイル名")」とする
def update @post = Post.find_by(id: params[:id]) @post.content = params[:content] if @post.save redirect_to("/posts/index") else render("posts/edit") end end
errors.full_messages
- エラーメッセージを取得するメソッド
- 今回の例だと送信ボタンを押す前はpost.errors.full_messagesはカラの配列だが、保存時にエラー(=バリデーションに引っかかった)がある場合に配列にメッセージが入る
- なんで標準のエラーメッセージが日本語なん?というのは、少しひっかかった。もしや、用意されてるやつ・・!?
<% @post.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %>
flash
- ページ上に1度だけ表示されるメッセージをフラッシュという
- フラッシュが表示された後、ページを更新したり、別のページに移動したりすると、フラッシュは表示されなくなる
- Railsではフラッシュを表示するために、特殊な変数flashが用意されている
- アクションで変数flash[:notice]に文字列を代入すると、flash[:notice]をビューで使うことができる
- 変数flashは1度表示された後に自動で削除される
def update @post = Post.find_by(id: params[:id]) @post.content = params[:content] if @post.save flash[:notice]="投稿を編集しました" redirect_to("/posts/index") else render("posts/edit") end end
<% if flash[:notice] %> <div class="flash"> <%= flash[:notice] %> </div> <% end %>
新規投稿時
- 投稿エラーになった際に投稿画面に戻って字が消えていたらショックなので、直前まで入れた文字をparamsに持たせる
- その関係上、テキストエリアには@post.contentが元々入っている状態だが、コントローラに何も入れていないとエラーになる(@postが定義されてないので)
- なので定義するのだ
- フーン感半端ねえ
def new @post=Post.new end
<textarea name="content"> <%= @post.content %> </textarea>