■ ターミナルで以下のコマンドを実行してください
rails console
■ コンソールで以下のコードを実行してください
post = Post.new(content: “Rails勉強中!”)
post.save
find_byメソッド
find_by
特定のidの投稿を取得するためには、find_byメソッドを用います。
find_byメソッドは、ある条件に合致するデータを取得することができます。
図のように、「モデル名.find_by(カラム名: 値)」とすることで、その値を持ったデータをデータベースから取得することができます。
URLにidを含めよう
ルーティング:id
ルーティングのURL部分に「:」を用いて「posts/:id」と指定することで、「/posts/1」でも「/posts/2」でもshowアクションにいくようにすることができます。
「posts/:id」と書くと「/posts/◯◯」のような全てのURLが該当します。
posts/:idの注意点
ルーティング:id
「posts/:id」というルーティングは「posts/index」より下に書かなければいけません。
ルーティングは合致するURLを上から順に探します。そのため「posts/index」よりも上に書くと、「localhost:3000/posts/index」というURLは「posts/:id」というルーティングに合致してしまいます。
get “posts/:id” => “posts#show”
def show
end
変数params
params
コントローラのアクション内では、ルーティングで設定したURLの「:id」の値を取得することができます。その値はparamsという変数にハッシュとして入っています。
params[:id]とすることで、その値を取得することができます。
def show
# 変数paramsから「:id」の値を取得し、変数@idに代入してください
@id = params [:id]
end
<%= "idが「#{@id}」の投稿詳細画面です" %>
投稿詳細ページを完成させよう
showアクションで変数@postを定義し、idカラムの値がparams[:id]と等しい投稿をデータベースから取得して代入します。
@postをshow.html.erbで表示することで、各URLに対応した投稿のデータが表示されるようにしましょう!
class PostsController < ApplicationController def index @posts = Post.all end def show # find_byを用いてpostsテーブルから「params[:id]」に対応するデータを取り出し、変数@postに代入してください @post = Post.find_by(id: params[:id]) end end
<%= @post.content %>
<%= @post.created_at %>
<%= link_to(post.content, "/posts/#{post.id}") %>
新規投稿ページの準備
新規投稿ページは、「localhost:3000/posts/new」というURLでアクセスできるようにしましょう。
そのためにルーティング、アクション、ビューを追加しましょう。
アクションは、newアクションとしましょう。
入力フォームを作成しよう
textareainput
HTML & CSSのレッスンで学習した
投稿を保存するまでの流れ
フォームの投稿ボタンを押すと、Rails側に投稿データが送信されます。
今回はcreateアクションを用意して、受け取った投稿データをデータベースに保存するようにします。
createアクションのURLは「/posts/create」としましょう。
createアクションの
ルーティング
ルーティングpost
createアクションのルーティングを設定しましょう。
今までルーティングを書く際に「get」と書いてきましたが、フォームの値を受け取る場合は「post」とする必要があります。(この「post」はPostモデルの「Post」とは関係ありません。)
通常は「get」、フォームの値を受け取るときは「post」というように覚えておきましょう。
フォームの送信先を指定しよう
form_tag
form_tagメソッドを用いると、フォームに入力されたデータを送信することができます。form_tagは、「form_tag(送信先のURL) do」のように送信先のURLを指定します。
これによって、のボタンを押した時に、指定されたURLにデータが送信されます。
<%= form_tag("/posts/create") do %>
<% end %>
redirect_to
redirect_toリダイレクト
他のURLに転送(リダイレクト)するには、redirect_toメソッドを用います。
redirect_toは「redirect_to(URL)」とすることで、そのページに転送することができます。
def create
# redirect_toメソッドを用いて、自動的に投稿一覧ページに転送されるようにしてください
redirect_to(“/posts/index”)
name属性
name
今の状態のフォームでは、投稿ボタンを押しても入力した内容をcreateアクションに伝えることができません。
フォームに入力されたデータを受け取る
name属性を指定したフォームに入力されたデータは、コントローラのアクション内で受け取ることが可能になります。
フォームのデータは、変数paramsで受け取ります。paramsはname属性に設定した文字列をキーとしたハッシュになっています。
Postインスタンスを作成する際にparams[:content]を用います。そのPostインスタンスを保存することで投稿機能の完成です!
変数paramsのまとめ
入力データを受け取るためのparamsはURLからidの値を取得するときにも使いました。
paramsは以下の2通りの使い方があるので、整理して覚えておきましょう。
①「:○○」を使ったルーティングのURLから値を取得する
②「name=”○○”」が付いたフォームの入力内容を受け取る
def create
# フォームから送信されたデータを受け取り、保存する処理を追加してください
@post = Post.new(content: params[:content])
@post.save
redirect_to(“/posts/index”)
end
orderメソッド
order
orderメソッドを用いることで、投稿一覧を並び替えることができます。
order(カラム名: 並び替えの順序)のように使います。並び替えの順序には、昇順(:asc)と降順(:desc)のどちらかを指定できます。
created_atを基準に降順(:desc)に並べ替えると、新しいものから順番に表示するようにできます。
# Post.allにorderメソッドを用いて、新しい投稿が上から順に表示されるようにしてください
@posts = Post.all.order(created_at::desc)