Webエンジニア目指して#36
どうもラクママンです。 使ってないものを金にすべくせこせこ出品してます。本当は引っ越す前に終わらせるつもりだったけど働いてるとリフレッシュで精一杯でしたね
さてProgateのRails IIIです。
投稿ページの作成
前回のactionとデータベースを利用してWebページにレコードの特定の値を表示させる機能を使って投稿をできるようにする
モデル名.find_byメソッド
テーブルから目的の値を持ったレコードを持ってきてくれる
変数に代入して欲しい条件の欲しい値を使ったりなどに利用する
routingのURLにidを含める
routingにget 'post/:id' => 'post#details'
のような記述をすると、
URLが/post/1
や/post/aiueo
のように
末尾が何の文字でも指定したactionを参照する(post以降の/
が1個の場合のみ)
ユーザーidごとにそのユーザーに対応したページを表示させる、などが可能になる
URLからidを取得する
routingにidを仕込んだ状態で、参照先のactionに@id=params[:id]
を記述すると、
変数@id
にURL末尾の文字列が代入される
これをviewに利用したりする
投稿詳細ページ
上記を組み合わせて投稿詳細ページを作ってみる
view
<h1>投稿詳細</h1> <%= @post.message %> <%= @post.created_at %>
controller
class PostController < ApplicationController def details @post=Post.find_by(id: params[:id]) end end
routing
Rails.application.routes.draw do get 'post/:id' => 'post#details' end
結果 urlの末尾がpost/1に対してしっかりpostsテーブルのid:1のレコードを返している
投稿詳細ページへのリンク
前回の記事で書いたlink_toメソッドを使って、メインページに並べられた投稿それぞれに詳細のリンクをつける
メインページ
<h1>ruby埋め込みテスト用</h1> <% @posts.each do |post| %> <div class="messages-entire"> <%= link_to(post.message,"/post/#{post.id}") %> </div> <% end %>
詳細ページ
<h1>投稿詳細</h1> <p>--------</p> <%= @post.message %> <%= @post.created_at %> <p>--------</p> <a href="/post/index">戻る</a>
こんな感じ
投稿機能の実装
投稿ページ
htmlのtextareaに入力し投稿ボタンを押したらrailsが内容をデータベースに保存してくれるようにする
以下のようにtextarea
にname属性を付けて、
<%= form_tag("データの送信先パス") do %>
と
<% end %>
で投稿フォームを挟むことで、railsによってname属性をキーとしたハッシュが指定パスへ送られる
view
<%= form_tag("/post/save") do %> <textarea name="message"></textarea> <input type="submit" value="投稿"> <% end %>
また、name属性をつけてform_tag
メソッドで飛ばしたデータは送信先のactionで以下のように受け取ることができる
params[:name属性の値]
例えば、上記のtextareaに"aiueo"と入力し送信した場合は、ハッシュ{message:"aiueo"} を受け取り、params[:message]は"aiueo"を返す
フォーム送信先のrouting
post 'post/save' => 'post#save'
form_tagで指定するrouteはget
ではなくpost
から始める
actionにリダイレクトを仕込む
redirect_to("リダイレクト先URL")
専用のviewを用意していなくても別のviewへ飛ばすことができる。今回の投稿のような、処理だけして一覧へ飛びたいactionに最適
フォーム送信先のaction
ここまで書いたことと、前回の記事でrails consoleを使ってテーブルにレコードを保存したときの知識を使って、Postテーブルへmessageカラムの内容を指定したレコードの作成、保存をさせる。その後投稿一覧へ飛ばす
def save @post=Post.new(message: params[:message]) @post.save redirect_to("/post/index") end
できた
投稿成功
投稿一覧を新しい順に並べ替える
投稿一覧ページのactionにorder
メソッドを使うと読み込みの際に並べ替えができる
def index @posts=Post.all.order(created_at: :desc) end
orderメソッドは:
を2回使うところに注意
結果
というわけでRails III終わり!ではでは