Ruby on Rails5 Progate Ⅲ サイト利用者の投稿
.find_byメソッドで投稿を取得
「モデル名.find_by(カラム名: 値) 」
でデータベースから条件に合致するデータを取得する
ex.)[rails console]
post = Post.find_by(id:3)
//post.content で取得したデータのcontent部分を表示
投稿詳細ページの作成
Ruby on Railsにおいて新たにページを作成する際には
「ルーティング」、「アクション」、「ビュー」が必要
投稿詳細ページのURLに表示したい投稿のidを入れる
〜やり方〜
・showアクションを作る
・ルーティングのURL部分を「posts/:id」とすると入力されたidを取得してくれる
・view/postsフォルダにshow.html.erbファイルを追加
*ルーティングは合致するURLを上から見ていくので、
必ずget "post/index" => "posts#index" より下にかく
ルーティング設定
[routes.rb]
get "posts/:id" => "posts#show"
[posts_controller.rb]
def show
end
[show.html.erb]
//postsフォルダ内にファイルを作成
//URL が localhost:3000/posts/1 or 2 でもshowアクションに飛ぶ
*ここまでは、showアクションに飛ばすだけなので、URLからid(データベースのカラムの番号)を取得してデータベースのカラム番号を表示するにはアクション内に記述をする必要がある。
下記から↓!
showアクションの設定
showアクション内でURLの「id」とテーブルのカラム内の「id」とが対応したデータを表示する処理を記述する
変数params にハッシュでルーティングで設定したURLの id が入っている
params[:id] で取得
[posts_controller.rb]
def show
@id = params[:id]
//@id に URLの末尾の数値(id)を取得
end
[show.html.erb]
<%= @id %> //URLに記述されたidを表示
<%= "idが「#{@id}」の投稿詳細画面です" %> //idが1の投稿詳細画面です
URLに入力されたidとデータベースの「カラム番号」対応する投稿を表示
これもshowアクション内に記述する
[posts_controller.rb]
def show
@post = Post.find_by(id: params[:id])
end
詳細ページへのリンク作成
[index.html.erb]
〜
<% link_to(@post.content, "/posts/#{@post.id}")%>
〜
//さっき@postに代入した情報のid部分を取得してURLを生成
新規投稿ページの作成
ルーティング,アクション,ビューを設定
*ルーティングを:idがあるget分より上に書くように注意
投稿フォームの作成
<textarea>タグ
<input>タグ
[new.htnl.erb]
〜
<textarea></textarea>
<input type="submit" value="送信">
〜
//これに投稿を受け取る指示などを記入していく
投稿の保存
フォームの送信ボタンを押した後、Rails側にデータが送信される
・アクションを用意して、データベースに保存の命令をだす(controller.rb)
(今回はアクション名 create )
・アクションのルーティング(route.rb)
フォームの値を受け取る場合は「post」(*getではない*今回モデルにしたPostとは関係ない)
[routes.rb]
get "posts/new" => "posts#new"
post "posts/create" => "posts#create"
//通常は「get」
//フォームの値を受け取る時は「post」
フォームの送信先指定
「form_tag」メソッドでフォームの入力内容を送信できる
[new.html.erb]
<%= form_tag("/送信先URL") do %>
<textarea></textarea>
<input type="submit" value="送信">
//submitボタンを押した時に("送信先URL")にデータが送信される
<% end %>
*注意
1、 <%= %>で囲む
2 、 do と end の中にフォームを作る
*上記では送信先を指定しただけで
「①createに対応するviewがない」
「②アクションを指定していないので投稿内容が保存できない」と2つの問題があるので、以下で解決する
createアクションの作成
①createに対応するviewがない (解決法)
ビューを作成する代わりにcreateアクションでリダイレクト(他のURLに転送)を行う
[posts_controller.rb]
def create
redirect_to("/URL") メソッドを使用
end
②送信された投稿内容の保存 (解決法)
・上記の状態では入力した内容を保存先に紐付けできない
・<textarea>にname属性で保存先を指定するとそこに入力内容が送信できる(name属性の値をキーとしたハッシュがRails側に送れる)
・name属性で指定したフォームの入力内容はアクション内で受け取り可能
・フォームのデータは params変数 で受け取る(paramsはname属性に設定した文字列をキーとしたハッシュになっている)
[posts_controller.rb]
def create
@post = Post.new(content: params[:content])
@post.save
//テーブルcontentの内容をフォームに入力された内容で保存
redirect_to("/URL") メソッドを使用
end
変数「params」のまとめ
ざっくり以下の2通りの使い方がある
・「: ◯◯」を使ったルーティングのURLから値を取得
・「name:="◯◯"」を使ったフォームの入力内容を受け取る
[paramsの使い方]
① get "posts/:◯◯" => "posts#..."
②<textarea name="◯◯"></textarea>
//上記2つがparams[:◯◯]で取得できる
投稿一覧の並び替え
orderメソッド を使用 。昇順(:asc)と降順(:desc)
*created_atを基準にすると作成日時で順番を変更できる
[posts_controller.rb]
def index
@posts = Post.all.order(created_at: :desc)
end