2. バリデーションを設定しよう
バリデーションの設定
post.rb
class Post < ApplicationRecord
validates :content, {presence: true, length: {maximum: 140}}
end
ターミナルで確認
post = Post.new(content: "3時のおやつの時間だー!今Railsを教えてくれているひつじ仙人が、すごく美味しいシュークリームとコーヒーを差し入れてくれたよー♡ちょっと疲れてきてたから、助かる...!さあこのあともRails頑張るぞ!ところで、シュークリームとひつじ仙人ってちょっとだけ形が似ているような...。")
post.save
3. 新規投稿ページを作ろう
新規投稿ページ用の
① ルーティング
② アクション
③ ビュー
を作成しましょう。
①まずは、ルーティングを追加しましょう。
・ 対応するアクションはpostsコントローラのnewアクションとしてください。
・ get "posts/:id" => “…”よりも上に書くことに注意してください。
②続いて、postsコントローラにnewアクションを作成しましょう。
③新規投稿ページ用のビューを作成しましょう。
views/postsフォルダで右クリックをし、「新規ファイル」を選択し、
new.html.erb
という名前のファイルを作成してください。
①
Rails.application.routes.draw do
get “posts/index” => “posts#index”
get “posts/new” => “posts#new”
get “posts/:id” => “posts#show”
get “/” => “home#top”
get “about” => “home#about”
end
②
class PostsController < ApplicationController
def index
@posts = Post.all.order(created_at: :desc)
end
def show
@post = Post.find_by(id: params[:id])
end
def new
end
end
③
投稿する
ヘッダーメニューにリンク追加
ヘッダーから新規投稿ページにアクセスできるように、リンクを追加してください。
application.html.erb
4. 投稿を保存しよう
https://prog-8.com/rails5/study/3/10#/23
https://prog-8.com/rails5/study/3/12#/29
新規投稿ページで「投稿」ボタンが押されたときに、フォームの内容がデータベースに保存されるようにしてください。
※ ただし、
・フォームの送信先のURLは、/posts/createにしてください。
・投稿の保存後は、投稿一覧ページにリダイレクトしてください。
ヒント
form_tagを用いて、フォームの送信先のURLを設定します。
<%= form_tag("送信先URL") do %>
フォームの中身
<% end %>
コントローラのアクション内で変数paramsから値を取得するために、name属性を指定します。
リダイレクト処理は、以下のように記述します。
redirect_to(“URL”)
フォームからデータを送信するために、
①ルーティング
②アクション
③form_tag
を定義しましょう。
①
post “posts/create” => “posts#create”
②
def create
@post = Post.new(content: params[:content])
@post.save
redirect_to(“/posts/index”)
end
③
投稿する
<%= form_tag("/posts/create") do %>
<% end %>
5. サクセス・エラーメッセージ
投稿の保存に成功したときに、リダイレクト後のページでサクセスメッセージが表示されるようにしてください。
投稿の保存に成功したかどうかで処理を分けるためには、以下のようにします。
https://prog-8.com/rails5/study/5/7#
ヒント
if @post.save
# 投稿の保存に成功したときの処理
else
# 投稿の保存に失敗したときの処理
end
また、保存に成功したときのメッセージの表示は、以下のように行います。
flash[:notice] = “メッセージ”
投稿の保存に失敗したときに、フォームを再表示し、エラーメッセージが表示されるようにしてください。
ヒント
フォームを再表示するためには、renderを用いて、アクションを実行せずに新規投稿ページのビューを表示させます。
render(“フォルダ名/ビュー名”)
エラーメッセージを表示するには以下のようにします。
@post.errors.full_messages
成功
posts_controller.rb
def create
@post = Post.new(content: params[:content])
if @post.save
flash[:notice] = “投稿を作成しました”
redirect_to(“/posts/index”)
else
render(“posts/new”)
end
end
application.html.erb
<% if flash[:notice] %>
<% end %>
失敗
new.html.erb
<% end %>
6. 投稿の編集ページを作ろう
post “posts/create” => “posts#create”
get “posts/:id/edit” => “posts#edit”
def edit
@post = Post.find_by(id: params[:id])
end
edit.html.erb
show.html.erb
<%= link_to("編集", "/posts/#{@post.id}/edit") %>
7. 編集機能を完成させよう
投稿編集ページで「保存」ボタンが押されたときに、フォームの内容がデータベースに保存されるようにしてください。
※ ただし、
フォームの送信先のURLは、/posts/1/updateなどのように、idを含めるようにしてください。
編集内容の保存が成功したときに、投稿一覧ページにリダイレクトし、サクセスメッセージが表示されるようにしてください。
編集内容の保存に失敗したときに、フォームを再表示し、エラーメッセージが表示されるようにしてください。
post “posts/:id/update” => “posts#update”
成功したとき
posts_controller.rb
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
失敗したとき
edit.html.erb
編集する
<%= form_tag("/posts/#{@post.id}/update") do %>
<% end %>
<% end %>
8. 削除機能を作ろう
・投稿詳細ページに「削除」リンクを追加してください。
・削除ボタンを押したときに、投稿が削除されるようにしてください。
ヒント
今回はルーティングがpostであるため、第3引数でpostを指定します。
link_to(リンクテキスト, リンク先URL, {method: “post”})
データを削除するためには、destroyメソッドを使います。
以下の用に記述します。
@post.destroy
投稿が削除された後は、投稿一覧ページにリダイレクトし、サクセスメッセージを表示してください。
ルーティング
post “posts/:id/destroy” => “posts#destroy”
アクション
def destroy
@post = Post.find_by(id: params[:id])
@post.destroy
flash[:notice] = “投稿を削除しました”
redirect_to(“/posts/index”)
end
削除リンク
show.html.erb