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

どうもギター売りマンです strandbergというメーカーの7弦ギターを何故か2本持っているので片方出品しました。何故でしょうねえ・・・ 手放すのが惜しいので元値からあまり下げてないけど、売れて欲しい、売れて欲しくない、売れて欲しい

そんな感じでやっていきましょう、ProgateのRails VIIIです

目標:ユーザーアカウント機能実装

ログインページの作成

view

<h1>ログイン</h1>
<% if @error_message %>
  <%= @error_message %>
<% end %>

<%= form_tag("/login") do %>
  <p>e-mail</p>
  <input name="email" value="<%= @email %>">
  <p>パスワード</p>
  <input type="password" name="password" value="<%= @password %>">
  <input type="submit" value="ログイン">
<% end %>

冒頭の記述でログインに失敗したとき用の@error_messageを表示させるようにする

後は今まで通りフォームを記述

inputのtype属性をpasswordにすることで以下の画像のように入力時に隠れるようになる

f:id:misokatsu_sand:20210403183649p:plain

パスワードの欄を増やしたので前回と同じようにデータベースにも専用のカラムを増やしておく。また、usersモデルにvalidates:password,{presence:true}のvalidationを設ける

routing

  get 'login' => 'users#login_form'
  post 'login' => 'users#login'

getとpostは同じURLにしても大丈夫らしい(自作するなら分けるかなあ)

action

def login
    @user=User.find_by(email: params[:email],
                       password: params[:password])
    if @user
      flash[:notice]="ログインしました"
      redirect_to("/post/index")
    else
      @error_message="メールアドレスかパスワードが間違っています"
      @email=params[:email]
      @password=params[:password]
      render("users/login_form")
    end
end

find_byでフォームに入力されたemailとpassが一致したレコードを取得し、取得の結果でif文を書く

このようにif 変数という書き方をすると変数がnilかどうかで分岐してくれるみたい(nilの場合にelseになる)

elseにはviewで言及したログイン失敗メッセージ用の変数とフォームの初期値に代入

結果

f:id:misokatsu_sand:20210408010941g:plain

ユーザー認証は出来たのでログインページは完成

ログイン処理

先程のユーザー認証はユーザーを特定したが飛んだページはただの投稿一覧なので、「このユーザーでログインしてますよ」という処理を書いていく

session変数

session[:キー名]の形で使う
この変数はブラウザが記憶してくれるらしく、ユーザーidなどを代入しておけばログイン中のユーザー名表示や権限などの実装ができる

action

先程のユーザー認証actionに、認証が成功したときにそのユーザーの情報をsession変数に代入させる

def login
    @user=User.find_by(email: params[:email],
                       password: params[:password])
    if @user
      session[:user_id]=@user.id
      session[:user_name]=@user.name
      flash[:notice]="ログインしました"
      redirect_to("/post/index")
    else
      @error_message="メールアドレスかパスワードが間違っています"
      @email=params[:email]
      @password=params[:password]
      render("users/login_form")
    end
  end

ユーザーidとユーザー名を取得させた。
ユーザー名を後述のviewで使う
ユーザーidは、まあそのうちなんか使い道あるでしょ

application.html

ヘッダーにその時ログインしているユーザーの名前を表示させる

<p>ログイン中のユーザー:<%= session[:user_name] %></p>

結果

右上のログイン中に注目 f:id:misokatsu_sand:20210408163418g:plain

割愛するが、新規登録の際にもパスワードを取得し、登録完了したらそのままログインできるようにする

ログアウト処理

session変数にnilを代入すればブラウザに記憶されたユーザーがリセットされる

view

ログアウトのlink_toに`{method:"post"}を書いている。フォームデータのやりとりをする場合以外に、session変数に変更を加える場合もpostでroutingする必要がある

また、先程のif 変数を利用してsession変数の中身があるかないか、つまりログイン状態かログアウト状態かどうかでヘッダーに表示させる項目を変えている

<% if session[:user_id] %>
  <div class="header-info">
    <p>ログイン中のユーザー:<%= session[:user_name] %></p>
  </div>
  <ul class="header-menu">
    <li><%= link_to("投稿一覧", "/post/index") %></li>
    <li><%= link_to("新規投稿", "/post/new") %></li>
    <li><%= link_to("ユーザー一覧", "/users/index") %></li>
    <li><%= link_to("ログアウト", "/logout",{method:"post"}) %></li>
  </ul>
<% else %>
  <ul class="header-menu">
    <li><%= link_to("新規登録", "/users/new") %></li>
    <li><%= link_to("ログイン", "/login") %></li>
  </ul>
<% end %>

routing

post 'logout' => 'users#logout'

action

def logout
    session[:user_id]=nil
    session[:user_name]=nil
    flash[:notice]="ログアウトしました"
    redirect_to("/login")
end

結果

f:id:misokatsu_sand:20210409024541g:plain

変数にログイン中ユーザーのレコードを代入する

上記までsession変数をid用name用で2つ用意していたが、session変数でユーザーid1つ取得しておけば下記のように同一レコードの他のデータを参照できる

<% current_user=User.find_by(id:session[:user_id]) %>
      <% if session[:user_id] %>
        <div class="header-info">
          <p>ログイン中のユーザー:
            <%= link_to(current_user.name,"/users/#{current_user.id}") %></p>
        </div>
-----以下略-----

ただ、この書き方だとユーザーデータを参照する全てのviewでレコード用の変数を定義する必要ができてしまう

そこで、下記のようにcontrollerに対してbefore_action :共通処理のactionと書くことでそのcontrollerの全てのactionの前に、指定した処理をさせるシステムを利用する

class ApplicationController < ActionController::Base
  before_action :set_current_user

  def set_current_user
    @current_user = User.find_by(id: session[:user_id])
  end
end

こんな感じでクラスの直下に書く。 ApplicationControllerに書いて全てのviewに対してログイン中のユーザーデータを利用、ということもできる

@current_userで定義したところで、先程viewに書いたcurrent_userを書き替える

<% if @current_user %>
  <div class="header-info">
    <p>ログイン中のユーザー:
    <%= link_to(@current_user.name,"/users/#{@current_user.id}") %></p>
  </div>
-----以下略-----

ついでにifの条件も書き替えた。ログイン/ログアウトactionで定義していたsession[:user_name]は使わないため削除しておく

アクセス制限

ユーザー認証メソッドを作る

application.controllerに以下のメソッドを追加する

def authenticate_user
    if @current_user == nil
      flash[:notice]="ログインが必要です"
      redirect_to("/login")
    end
end

先程before_actionで仕込んだメソッドによって、先に@current_userが定義されるため使い回しができる

before_actionにonlyを指定する

application.controllerにメソッドを作っただけでは作動しないため、users.controllerに以下のように書く

class UsersController < ApplicationController
  before_action :authenticate_user,{only: [:index,:show,:edit,:update]}
----以下略----

全てのcontrollerはapplication.controllerを継承しているため、このようにusersでも先程の認証用のメソッドを仕込める

また、before_actionの第2引数に{only: [:メソッド1, :メソッド2]}のように書くとそれらのメソッドに対してのみbefore_action処理が行われるようになる

これによって、ログインが必要な機能、不要な機能を分けることができる。
例えばログインや新規登録にログインが必要だったら困るため、それらを除外してbefore_action処理を行わせるように書く。 逆に、ログイン済でログインや新規登録の画面は表示させたくないのでログイン済みなら弾くメソッドを用意してbefore_actionで各actionに適用させておく

post.controllerは全てログインを必要とさせたいためonlyを使わずbefore_actionで認証用メソッドを仕込んでおく

結果

f:id:misokatsu_sand:20210412031400g:plain

他のユーザーにユーザー情報を編集させないようにする

ログイン中ユーザーとユーザー情報ページのidが一致している場合だけ編集と削除を表示させる

<% if @current_user.id == @user.id %>
  <%= link_to("編集","/users/#{@user.id}/edit") %>
  <%= link_to("削除","/users/#{@user.id}/delete",{method:"post"}) %>
<% end %>

表示は消したがURLに入力すれば編集ページに入れてしまうため、そこもカバーしていく

ログイン中のユーザーidとURLに入力されたidが違うなら弾くメソッドを作成し、 編集ページとactionに対して適用する

  before_action :check_incorrect_user, {only: [:edit,:update]}

  def check_incorrect_user
    if @current_user.id != params[:id].to_i
      flash[:notice]="権限がありません"
      redirect_to("/post/index")
    end
  end

params[:id]は文字列として取得してしまうため、いつかしらのパートで使ったto_iメソッドで数値へ変換して比較演算にかける

結果

f:id:misokatsu_sand:20210412031517g:plain

ということでRails VIIIはおわり! 書きすぎて長引いちゃった ではでは。

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

どうも特に無いマンです。

暇ではないんですが、仕事ないとなんか足りないですね〜
腹が減ったときの飯が美味いのと同じで、ある程度ストレスないと娯楽も楽しみが減りますね。フリマに断捨離以外はやり残したことなくなってきたんで学習時間の増やしどころかも

さてやっていきましょうProgateのRails VIIです

目標は画像の投稿機能実装

テーブルへカラムを追加する

migrationファイルのみ作成しデータベースへ反映させる

$rails g migration ファイル名

試しに作ってみたものの中身がこれ

class AddImageNameToUsers < ActiveRecord::Migration[6.1]
  def change
  end
end

今回は空だが、実は今まで使っていた$rails g modelを実行した場合はchangeメソッドの中身は自動生成されていた

カラムを追加したい場合は以下のように書く

class AddImageNameToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :テーブル名, :カラム名, :データ型
  end
end

次に$rails db:migrateを実行するとchangeメソッドが実行され、対象のテーブルにカラムが追加される

試しに実行してみた f:id:misokatsu_sand:20210327013504p:plain

比較画像:実行前 f:id:misokatsu_sand:20210327014039p:plain 比較画像:実行後 f:id:misokatsu_sand:20210327014057p:plain image_nameカラムが増えたので成功

画像とリンクさせる

テーブルに追加したカラム名の文字列と画像ファイル名をレコードごとに一致させ、後はhtmlで参照するだけ

データベース

既存のレコードはimage_nameカラムが空だったので追加しておく f:id:misokatsu_sand:20210331003003p:plain

画像ファイルの保存場所

画像ファイル名とimage_nameカラムの値を一致させる f:id:misokatsu_sand:20210331010104p:plain

html

imgタグの参照先に先程一致させた値を使ってパスを埋める railsを使っているときはimgタグは/publicフォルダから参照されるため、それに合わせて記述する

<img src="<%= "/user_images/#{@user.image_name}" %>">

結果

f:id:misokatsu_sand:20210331014546p:plain

画像の投稿フォーム

html

<%= form_tag("/users/#{@user.id}/update",{multipart:true}) do %>
  <p>ユーザー名</p>
  <input name="name" value="<%= @user.name %>">
  <p>e-mail</p>
  <input name="email" value="<%= @user.email %>">
  <p>プロフィール画像</p>
  <input type="file" name="image">
  <p>-</p>
  <input type="submit" value="変更">
<% end %>

inputタグのtype属性をfileにするとファイルを選んで送信できる
また、name属性も指定しているため画像のデータが[:image]として送信される

ファイルの送信フォームがあるときは、form_tagの第2引数に{multipart:true}を入れる必要がある

見た目はこんな感じ

f:id:misokatsu_sand:20210401033819p:plain

画像を受け取り保存する

if params[:image]
  @user.image_name="#{@user.id}.jpg"
  image=params[:image]
  File.binwrite("puclic/user_images/#{@user.image_name}","image.read")
end

まずif params[:image]でファイルが選択されている場合のみの処理とし、
@user.image_name="#{@user.id}.jpg"でデータベースへファイル名を登録
image=params[:image]でファイルを受け取り、
File.binwrite("puclic/user_images/#{@user.image_name}",image.read)
指定ディレクトリへファイルを作成する。
画像データを受け取りファイル作成する場合は受け取ったハッシュに対してreadメソッドというものを使う

いやそもそもFile.binwriteってなんやねん、となるので説明

File.write("ファイル名のパス","ファイルの中身")

このようにFileクラスというものがあり、writeメソッドを使うことで指定のディレクトリへファイルを作成できる。
(パスはアプリケーションのルートディレクトリから参照するので注意)

File.write("public/test.txt","aiueo") を実行した場合は、/public/test.txtというファイルが作成され、その中身がaiueo、ということになる

File.binwriteはその中身が2進数のバージョンであり、readメソッドを使って受け取った画像ファイルを2進数のデータに変換してファイルを作成している。

失敗談だがimage.readは変数.メソッドなので"image.read"と書かないように注意(ファイル生成がうまく出来ていなかった)

結果

f:id:misokatsu_sand:20210401051226g:plain

これ、簡易的にtwitter作れるんじゃね・・・?

ってなわけでRails VIIはおわりです ではでは

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

どうもダンレボ2クレで消費カロリー200kcal、すなわちリングフィット1時間分であることを知ったマンです。

体力がないのでこれだけで足の疲れが翌日に持ち越されてしまいます...三重にいた頃は手軽に行ける銭湯があってよかったなあ

というわけで引き続きProgate Rails VIです。 Rails道場編IIをやりましたが反復なので割愛しました。

重複バリデーション

class User < ApplicationRecord
  validates:email,{uniqueness:true}
end

{uniqueness:true}はデータベースに対して特定のカラムの重複登録を防いでくれる

できたもの

f:id:misokatsu_sand:20210322050125g:plain

VIはpostビューでtextareaだったものがinputになった以外はほぼ同じことをやってるのであんまり書くことありませんでした

ではでは

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

どうもスマブラマンです。 新キャラ実装日ですね。ゼノブレ2やる前にホムラヒカリ来ちゃったな〜クリア後だったらすごいテンション上がってたと思います。
残すは2キャラ、一体何が来るんでしょう。アルルきて(切望)

さてProgateのRails Vやっていきましょう

バリデーションで空の投稿を防ぐ

データベースに保存されるデータをチェックし、意図しないものは弾くシステムのことをバリデーションという

モデルファイルに対して記述する

class Post < ApplicationRecord
  validates :message,{presence: true}
end

第2引数の{presence: true}が空の文字数を弾くバリデーション 第1引数のmessageカラムに対して動作する

これを記述した状態でmessageカラムが空のレコードを保存してみると、 f:id:misokatsu_sand:20210305110642p:plain falseと出て失敗する(本来はtrueと出て保存内容が表示される)

actionに組み込んでやるとそのままスルーする これで空の投稿や編集ができちゃう問題は解決

バリデーションで文字数制限
validates :message,{length: {maximum:140}}

{length: {maximum:140}の部分が文字数制限。
下のように他のバリデーションとまとめて書くことができる

validates :message,{presence: true,length: {maximum:140}}
バリデーションの結果で表示を変える

バリデーションに引っかかる状態でsaveメソッドを使ったらfalseを返すのを利用して、if文に組み込む

いつぞやの新規投稿actionを書き換える

def save
    @post=Post.new(message: params[:message])
    if @post.save
      redirect_to("/post/index")
    else
      redirect_to("/post/#{@post.id}/new")
    end
  end

if文の条件でしかsaveメソッドを書いてないがちゃんと実行した上で分岐をしてくれるらしい 結果はこんな感じ

f:id:misokatsu_sand:20210308133614g:plain

renderメソッド
render("controller名/viewファイル名")

routingアドレスを書かないように注意、viewファイルを直接参照する。接頭に/がないのにも注意
renderはviewを再描画する
redirectだと単純に再読み込みをするためactionの再実行によって入力した文字列が上書きされてしまうが、renderは定義や代入した変数は保持されるため、再描画直前の入力情報を表示させることが可能

以下の例のように、バリデーションで引っかかった際にrenderを使って直前の入力情報が表示されるようにする

投稿ページ(new.html.erb)

<div class="main">
<h1>新規投稿</h1>
<%= form_tag("/post/save") do %>
  <textarea name="message"><%= @post.message %></textarea>
  <input type="submit" value="投稿">
<% end %>
</div>

新規投稿画面だが再描画直前の入力を読み込ませるため、textareaに@post.messageを仕込んだ

saveアクション

def save
    @post=Post.new(message: params[:message])
    if @post.save
      redirect_to("/post/index")
    else
      render("post/new")
    end
end

バリデーションに引っかかりsaveがfalseを返したときにrenderで再描画をさせる
再描画時点では@post.messageは入力したレコードが代入されているため、viewで仕込んだtextareaに拾ってもらえる

newアクション

def new
    @post=Post.new()
end

viewに@postを書いているため、saveアクションが実行されるまでは定義されていない変数があることになり、最初にnewページを開いたときにエラーが出てしまう
これを防ぐために@postに空のレコードを入れておいた

投稿エラーメッセージを表示させる

下図のように、saveがfalseを返すときにレコード.errors.full_messagesの中にエラーメッセージが配列として入力される f:id:misokatsu_sand:20210308154705p:plain saveを実行するまではerrorsが空なことを利用してviewに仕込んでおく

<div class="main">
<h1>新規投稿</h1>
<% @post.errors.full_messages.each do |err| %>
  <%= err %>
<% end %>

<%= form_tag("/post/save") do %>
  <textarea name="message"><%= @post.message %></textarea>
  <input type="submit" value="投稿">
<% end %>
</div>

結果 f:id:misokatsu_sand:20210308161113g:plain なんか英語だがバリデーションの内容に対応したエラーメッセージが出ている、なんて便利なんだ

flash[:notice]

viewを一度表示したらnilにリセットされる変数。
保存に成功しました、みたいなメッセージ表示に使う

viewの上らへんにこんな感じで置いて、flash[:notice]に中身があるときだけ表示させる

<% if flash[:notice] != nil %>
        <div class="flash">
          <%= flash[:notice] %>
        </div>
<% end %>

saveアクションに仕込んでみた

def save
    @post=Post.new(message: params[:message])
    if @post.save
      flash[:notice]="新しく投稿しました"
      redirect_to("/post/index")
    else
      render("post/new")
    end
end

結果 f:id:misokatsu_sand:20210308174939g:plain

似たようなものを削除actionや編集actionに仕込んでRails Vはおしまい!ではでは。

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

どうも桃鉄マンです

名古屋に戻ったということで、久しぶりに友人と集まり桃鉄スマブラをしました。やっぱりオフラインじゃないと得られる楽しさが違いますね。最高の時間でした

さてProgateのRails IVです

getとpostの違い

get...データベースに変更を加えない post...データベースに変更を加える

データベースからレコードを編集する流れ

変数A=モデル名.find_by(編集対象のカラム名:値)
変数A.内容を変更したいカラム名
変数A.save

編集ページの作成

詳細ページから編集ページへのリンク(detail.html.erb)

  <%= link_to("編集","/post/#{@post.id}/edit") %>

link_toを使って閲覧中の詳細レコードのidを取得し編集ページへ飛ばす

編集ページ(edit.html.erb)

    <textarea name="message"><%= @post.message %></textarea>
    <input type="submit" value="保存">

後述のactionから対象のレコードのmessageカラムを取得しtextareaのデフォルト表示にする

routing

get 'post/:id/edit'=> 'post#edit'

このように変数は末尾じゃなくても仕込める

controller

def edit
    @post=Post.find_by(id: params[:id])
end

:idをURLから拾って、編集対象のレコードを取得する

編集機能の実装

編集ページ

<%= form_tag("/post/#{@post.id}/update") do %>
    <textarea name="message"><%= @post.message %></textarea>
    <input type="submit" value="保存">
  <% end %>

form_tagを使って:messageをupdateアクションに送信

routing

post 'post/:id/update' => 'post#update'

:idも一緒に送信する

action

def update
    @post=Post.find_by(id: params[:id])
    @post.message=params[:message]
    @post.save
    redirect_to("/post/index")
  end

編集対象レコードを取得し、編集内容の:messageをmessageカラムに代入し、saveメソッドを実行→投稿一覧にリダイレクト

結果

f:id:misokatsu_sand:20210304210916g:plain

データベースからレコードを削除する流れ

変数A=モデル名.find_by(編集対象のカラム名:値)
変数A.destroy

削除機能の実装

routing

post 'post/:id/delete' => 'post#delete'

今回は直でdestroyメソッドのactionへ通したい

詳細ページから削除actionへのリンク

<%= link_to("削除","/post/#{@post.id}/delete",
{method:"post"}) %>

link_toはgetで記述されたactionしか検索しないらしい
このように第3引数に,{method:"post"}をつけることでpostで記述したものを検索してくれる

action

def delete
    @post=Post.find_by(id: params[:id])
    @post.destroy
    redirect_to("/post/index")
end

対象レコードを取得しdestroyメソッドで削除、一覧へリダイレクト

結果

f:id:misokatsu_sand:20210304221900g:plain

なんかもう意匠すれば掲示板できますね。 Rails IV、終わり!ではでは。

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

どうもハロワマンです

ようやく失業給付の申請ができました。結構受け取りまで時間かかるんですね、もらうまでに転職終わっちまうぜ?

今回はProgateのRails 道場編 Iなのでwebアプリを立ち上げるまでの流れのまとめみたいな感じです

流れ

rails new アプリケーション名

rails s

rails g controller コントローラー名 ビュー名

html,cssなど見た目の部分の編集、構築 ページを増やしたらroutingとactionも増やす

rails g model モデル名 カラム名:データ型

rails db:migrate

consoleでDBテスト

後はviewやらcontrollerをゴリゴリ書く

以上

すんなり道場編はクリア〜 ではでは。

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終わり!ではでは