Ruby on Rails5 道場コース II

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

  • <%= link_to("TweetAppとは", "/about") %>
  • <%= link_to("投稿一覧", "/posts/index") %>
  • <%= link_to("新規投稿", "/posts/new") %>

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] %>

<%= flash[:notice] %>

<% end %>

失敗

new.html.erb

<% @post.errors.full_messages.each do |message| %>

<%= message %>

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

<% @post.errors.full_messages.each do |message| %>

<%= message %>

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

<%= link_to("編集", "/posts/#{@post.id}/edit") %>
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>

シェアする

  • このエントリーをはてなブックマークに追加

フォローする