投稿の編集
流れは、以下の通り。
①編集したい投稿を取得
②その投稿のcontentの値を上書き
③データベースに保存
$ rails console
> post = Post.find_by(id: 1) #①
> post.content = "Rails" #②
> post.save #③
フォームに初期値を設定
textareaタグで囲んだ部分を初期値として設定できる。
<textarea>初期値です。</textarea> <!-- テキストエリアに「初期値です。」が入る -->
特定のアクションで、URLのidと同じidの投稿データをデータベースから取得し、そのcontentの値を初期値に設定したりできる。
def edit
@post = Post.find_by(id: params[:id])
end
<textarea><%= @post.content %></textarea>
投稿内容の更新
流れは、以下の通り。
①URLに含まれたidを用いて、データベースから投稿データを取得
②フォームから編集内容を受け取り、投稿データを更新
<%= form_tag("/posts/#{@post.id}/update") do %>
:
<textarea name="content"><%= @post.content %></textarea> <!-- name属性を指定する -->
:
<% end %>
フォームの入力内容が変数paramsに代入され、updateアクションに送信される
def update
@post = Post.find_by(id: params[:id])
#params[:content]はフォームから送信された値を受け取る
@post.content = params[:content]
@post.save
:
end
投稿の削除
流れは、以下の通り。
①データベースから削除したい投稿を取得する
②destroyメソッドを用いて、投稿を削除する
@post = Post.find_by(id: params[:id]) #①
@post.destroy #②
getとpostの使い分け
「get」はデータベースを変更しないアクション
「post」はデータベースを変更するアクション
post用のリンク
link_toメソッドの第三引数に**{method: "post"}**と指定する
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
バリデーション
バリデーションとは、不正なデータがデータベースに保存されないように、データをチェックする仕組みのこと。
バリデーションはモデルで設定する。
class Post < ApplicationRecord
#validates :検証するカラム名, {検証する内容}
validates :content, {presence: true} #{presence: true}は空の投稿を防ぐバリデーション
validates :content, {length: {maximum: 140}} #{length: {maximum: 140}}は最大文字数140文字に設定
#検証する内容を複数指定するやり方
validates :content, {presence: true, length: {maximum: 140}} #コンマで区切る
end
renderメソッド
renderメソッドは、別のアクションを経由せずに、直接ビューを表示することができる。
**render("フォルダ名/ファイル名")**のように表示したいビューを指定する。
redirect_toメソッドと違い、そのアクション内で定義した@変数をビューでそのまま使うことができる。
def update
@post = Post.find_by(id: params[:id])
@post.content = params[:content]
#render("フォルダ名/ファイル名")
render("posts/edit")
end
エラーメッセージの表示
<!-- @post.errors.full_messagesにエラーメッセージの配列が入っているため、each文を用いることで全て表示することができる -->
<% @post.errors.full_messages.each do |message| %>
<%= message %>
<% end %>
フラッシュ
フラッシュとは、ページ上に一度だけ表示されるメッセージのこと。表示された後はページを更新したり、別のページに移動するとフラッシュは表示されなくなる。
アクションで変数flash[:notice]に文字列を代入すると、flash[:notice]をビューで使うことができる。
def update
if @post.save
flash[:notice] = "表示したい文字列"
:
end
end
<!-- フラッシュメッセージが存在する場合のみ、表示する -->
<% if flash[:notice] %>
<div class="flash">
<%= flash[:notice] %>
</div>
<% end %>