[Ruby on Rails5]Progate 学習メモ 2


引き続きメモ。とっ散らかっている内容は後でまとめます。

▼DBの内容を編集する
カラムの取得→値の上書き→保存
(update_atが更新される)

コンソールでの操作
変数 = テーブル名.find_by(id:xx)
変数.カラム名 = "値"
変数.save

実装するには下記のようにします。
投稿ページと編集ページが必要になるので追加します。

route.rbの記載は、
post "コントロール名/:id/アクション編集" => "コントロール名#アクション編集"

xxx_contoroller.rbの記載は、
def アクション投稿
@変数 = テーブル名.find_by(id: params[:id])
end

def アクション編集
@変数 = テーブル名.find_by(id: params[:id])
@変数.編集するカラム名 = テーブル名.new(編集するカラム名: params[:編集するカラム名])
@変数.save
redirect_to("コントロール名/アクション一覧")
end

xxx.html.erbの記載は、
<%= form_tag("コントロール名/#{@変数.id}/アクション編集") do %>
<textarea name="カラム名"><%= @変数.content %></textarea>
<input name="カラム" value="初期値">
<input type="submit" value="ボタン表示名">
<% end %>

※ユーザー名とメールアドレスのような1行の入力フォームの場合はtextarea タグではなくinputタグ(オプションなし)だけでよい。inputタグは閉じタグが不要。inputタグの初期値が必要な場合はvalueに記述する。ボタンの場合のvalueは表示名になる。

▼DBの内容を削除する
カラムの取得→値の削除(destroyメソッド)

コンソールでの操作
変数 = テーブル名.find_by(id:xx)
変数.destroy

実装するには下記のようにします。
route.rbの記載は、
post "コントロール名/:id/アクション削除" => "コントロール名#アクション削除"

※getはDBを変更しないアクション、postはDBを変更するアクション…と覚えればよい

xxx_contoroller.rbの記載は、
def アクション削除
@変数 = テーブル名.find_by(id: params[:id])
@変数.destroy
redirect_to("コントロール名/アクション一覧")
end

xxx.html.erbの記載は、
<%= link_to("表示名", "/コントロール名/#{@post.id}/アクション削除", {method: "変数"}) %>

※getで書かれているリンクを探してしまうので、postを探す書き方にする

▼投稿編集ページの設定
下記のURLにする前提とする
localhost:3000/コントロール名/id番号/アクション名

route.rbの記載は、
get "コントロール名/:id/アクション名" => "コントロール名#アクション名"

xxx_contoroller.rbの記載は、
def アクション名
@変数 = テーブル名.find_by(id: params[:id])
end

リンクの追加は、xxx.html.erbに記載
<%= link_to("表示名", "/コントロール名/#{@変数名.id}/アクション名") %>


▼バリデーション
不正なデータがデータベースに保存されないように、データをチェックする仕組みのことをバリデーションと言います。
バリデーションに引っかかった場合(不正なデータの場合)にはデータベースに保存されません。

バリデーションはモデルで設定します。
models/xxx.rbに記載します。

validates :検証するカラム, {検証内容}

複数のバリデーションを設定する場合は、カンマ区切りにする

validates :検証するカラム, {検証内容, 検証内容} ...

投稿に失敗したので、saveメソッドの挙動も制御する

▼空投稿を防止する
空投稿チェックの検証する場合は、models/xxx.rbに記載します。

validates :検証するカラム, {presence: true}

▼文字長を制限する
バリデーションでは、値が存在しているかだけでなく、文字数もチェックすることができます。models/xxx.rbに記載します。

validates :検証するカラム, {length: {maximum: 文字長}

▼値の重複がないかチェックする
バリデーションでは、値が存在しているかだけでなく、文字数もチェックすることができます。models/xxx.rbに記載します。

validates :検証するカラム, {uniqueness: true}

▼投稿の成功失敗で遷移先を変える
xxx.controller.rbに記載する

def 編集アクション
if @変数.save
redirect_to("成功パターンのURL")
else
render("失敗パターンのURL")
end
end

▼投稿失敗時に直前の投稿を表示させる
投稿失敗後に編集画面に遷移すると、編集画面はDBの情報を取得して表示させるので、編集前のテキストが表示されてしまう。
編集画面を経由せず、編集前のテキストが表示される。

xxx.controller.rbへの記載は、
def 編集アクション
@変数 = テーブル.find_by(id: params[:id])
@変数.カラム = params[:カラム]
if ...
...
else
render("新規アクションを指定")
end

※renderメソッド時のアクションの指定は頭「/」不要

def 新規アクション
@変数 = テーブル.new
end

xxx.html.erb(新規ビュー)
<%= @変数.errors.full_messages.each do |message| %>
<div class="form-error">
<%= message %>
</div>
<% end %>

<textarea><%= @変数.カラム %></textarea>

▼エラーメッセージを表示する(full_messagesメソッド)
xxx.html.erb

<%= @変数.errors.full_messages.each do |message| %>
<%= message %>
<% end %>

▼フラッシュ処理
ページ上に1度だけ表示されるメッセージをフラッシュといいます。
Railsではフラッシュを表示するために、特殊な変数flashが用意されています。アクションで変数flash[:notice]に文字列を代入すると、flash[:notice]をビューで使うことができます。

成功時にxxx.controller.rbへの記載は、

def 編集アクション
if 判定したい処理
flash[:notice] = "表示したい文字列"
...
end
end

xxx.html.erbへの記載は、
<% if flash[:notice] %>
<div class="flash">
<%= flash[:notice] %>
</div>
<% end %>