Webエンジニア目指して#36

どうもラクママンです。 使ってないものを金にすべくせこせこ出品してます。本当は引っ越す前に終わらせるつもりだったけど働いてるとリフレッシュで精一杯でしたね

さてProgateのRails IIIです。

投稿ページの作成

前回のactionとデータベースを利用してWebページにレコードの特定の値を表示させる機能を使って投稿をできるようにする

モデル名.find_byメソッド

テーブルから目的の値を持ったレコードを持ってきてくれる f:id:misokatsu_sand:20210216170151p:plain

変数に代入して欲しい条件の欲しい値を使ったりなどに利用する

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

結果 f:id:misokatsu_sand:20210223204550p:plain 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>

こんな感じ f:id:misokatsu_sand:20210224003646g:plain

投稿機能の実装

投稿ページ

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

できた

f:id:misokatsu_sand:20210224023552g:plain 投稿成功

投稿一覧を新しい順に並べ替える

投稿一覧ページのactionにorderメソッドを使うと読み込みの際に並べ替えができる

def index
    @posts=Post.all.order(created_at: :desc)
end

orderメソッドは:を2回使うところに注意

結果

f:id:misokatsu_sand:20210224024343p:plain

というわけでRails III終わり!ではでは