BNBのプログラミング勉強記録

ガチのプログラミング初心者が駆け上がっていくブログ

メモ(Rails V)

バリデーション

  • 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>