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

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

どうも筋肉痛マンです 思い出したようにワイドスクワットしたら足がヨボヨボになりました

ようやく退職証明書が届いたので色々と動ける!!1月後半はまあまあニート生活になってましたね

のんびりしてると貯金が尽きるので頑張っていこうと思います

というわけでProgateのRails IIです

2個目のcontroller生成

特に気にすることはなくrailsコマンドを使えば生成できる

役割が別のページはcontrollerを分けたほうがいいみたい

$ rails g controller sample aiueo

generategで略せる

html.erb内で変数宣言をする

.erbはembedded rubyから略されてたんですね

このファイルはrubyの埋め込みが可能で、
<% %>で囲うとページでの表示なし、
<%= %>で囲うとページでの表示ありでrubyのコードを記述できる

表示なしを利用して変数宣言などをして、
表示ありを利用して変数の値の出力をする

<% message1="こんにちは" %>
<%= message1 %>
配列とeach文でテキストを表示する

こんな感じで埋め込みとhtmlを織り交ぜることもできる

<% messages=[
  "メッセージ1",
  "メッセージ2"
] %>
<% messages.each do |message| %>
  <div class="messages-entire">
    <%= message %>
  </div>
<% end %>
controller actionにrubyを記述する

一般的には変数の定義はactionで記述するらしい

controller

class PostController < ApplicationController
  def index
    @messages=[
      "メッセージ1",
      "メッセージ2"
    ]
  end
end

html.erb

<div class="main">
      <% @messages.each do |message| %>
        <div class="messages-entire">
          <%= message %>
        </div>
      <% end %>
</div>

こんな感じで@変数名で扱うことでviewとcontrollerで相互的に使える @変数は配列に限らずなんでも使えるっぽい

データベースを用意する

migraionファイルの生成

まずはmigrationファイルというデータベースに指示を出すファイルを生成
railsコマンド$ rails g model テーブル名 カラム名:データ型

$ rails g model post message:text

今回は文字を入れるのでデータ型はtext

生成される場所はここ f:id:misokatsu_sand:20210211192140p:plain

中身はrubyで何やら書かれていますがまだわからないのでメモは割愛

class CreatePosts < ActiveRecord::Migration[6.1]
  def change
    create_table :posts do |t|
      t.text :message

      t.timestamps
    end
  end
end

テーブルの生成

先程のmigrationファイルを使ってデータベースに変更指示を出す

$ rails db:migrate

migrationファイルを作ったらmigrateをしないとどのviewを開いてもエラーが出るそう
migration errorが表示されるのでその際はmigrateが必要

modelの確認

migrationファイルの生成でmodelというものが下図のフォルダに作られている f:id:misokatsu_sand:20210211195720p:plain

中身はこれだけ

class Post < ApplicationRecord
end

ApplicationRecordを継承したクラスのことをmodelというらしい これがあることで生成したPostテーブルが操作できる

rails consoleでテーブルにレコードを追加する

rails consoleはrubyのコードを入力してEnterをするとその結果をすぐ出力するもの
終了するまでは定義した変数に代入した値など覚えてくれる
↓こんなやつ f:id:misokatsu_sand:20210212003833g:plain

これを使って、
変数=モデル名.new(カラム名:"文字列")を実行した後に
インスタンスを代入した変数.save を実行すると対象テーブルにレコードが保存される

↓こんな感じ
f:id:misokatsu_sand:20210212184559p:plain

このsaveメソッドが使えるのはApplicationRecordクラスを継承しているおかげみたい

rails consoleでテーブルからデータを取り出す

レコードを追加したので確認してみる
変数=モデル名.firstで変数にテーブルの1つめのレコードを代入できる
レコードを代入した変数.カラム名で対象レコードのカラム名に格納されたデータを参照できる

こんな感じ
f:id:misokatsu_sand:20210212185033p:plain

モデルのallメソッド

モデル名.all[0].messageのように、allメソッドを使うと配列としてテーブルにアクセスできる

データベースとアクションの連動

データベースの状態

progateではまだ出てきてないけどsqlite3で表示してみる f:id:misokatsu_sand:20210214024533p:plain rails dbconsoleで起動して.headers onカラム名の表示ON、あとはSQL文を打てばOK。ちゃんと保存したレコードが入ってる

rails consoleで見るよりこっちの方が絶対いいね

controller

class PostController < ApplicationController
  def index
    @posts=Post.all
  end
end

html.erb

<div class="main">
  <h1>ruby埋め込みテスト用</h1>
  <% @posts.each do |post| %>
    <div class="messages-entire">
    <%= post.message %>
    </div>
  <% end %>
</div>

できた

f:id:misokatsu_sand:20210214025421p:plain

要所はcontrollerの@posts=Post.allと
html.erbの<%= post.message %>

allメソッドで配列として変数に格納して、eachでmessageの値を取り出す。

viewの共通レイアウト

今のview

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <header>
      <p>テストページ</p>
    </header>
    <div class="main">
      <h1>ruby埋め込みテスト用</h1>
      <% @posts.each do |post| %>
        <div class="messages-entire">
          <%= post.message %>
        </div>
      <% end %>
    </div>
    <footer>
      <p>Copyright © misokatsusand All Rights Reserved.</p>
    </footer>
  </body>
</html>

これのmainクラスタグの部分だけ記述しても機能させる方法がある
(余談ですがhtml5はmainタグ標準装備されてます、後から知りました)

下図のディレクトリにあるapplication.html.erbというファイルがある f:id:misokatsu_sand:20210214031105p:plain

中身はこれ

<!DOCTYPE html>
<html>
  <head>
    <title>Webapp</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

デフォルトでこの状態だから中身は好みに書き換えるとして、
トップページなどのviewのhtmlにいきなりmainタグとその中身だけ書いても、
このapplication.html.erbの<%= yield %>の部分にhtmlが代入されてからブラウザに表示される。

これを使って共通するレイアウトはまとめられる

現状のように各viewに個別にheaderタグやら書いちゃってもそれはapplication.html.erbより優先されるっぽい

色々置きすぎて手元のhtmlはメンテの手間がでかいため割愛

link_toメソッド

<%= link_to("表示文字列","URL") %>

html.erbに使うメソッドで、aタグと同じ役割

有効利用の仕方はまた後から出てくるらしい。その時でよかったんじゃね?

以上、rails II終わり!ではでは

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

どうも無職マンです。

退職証明書類が未だ届かず、事務手続きを全て終わらせてからWebエンジニアのスクールへ臨むつもりが遅れてます。はよしてくれ〜〜〜〜〜

運動不足をなんとかしようと思って2億年振りにDDRやったんですが、全然踏めません。軟体動物が地団駄を踏むゲームになっています

そんな感じでいきまShow ProgateのRuby on Rails I !!!!!!!!!!!!!!

Webアプリケーションの生成
$ rails new application_name

ターミナルでこいつを入力すると自動で必要なディレクトリを作ってくれるらしい!行くぜうおお!
あ、$はコマンドを表す文字で、ターミナルに元々表示されるため入力は不要です f:id:misokatsu_sand:20210202062741p:plain Rails入っとらんやんけ!!!!!!!

f:id:misokatsu_sand:20210202063445p:plain 入れてきました。なにやら警告されてますが初めてRailsを始める場合は無視でいいそうなので無視します

というわけで先程のrails newを実行すると f:id:misokatsu_sand:20210202112551p:plain 予想よりたくさん生成されました。これがwebアプリの土台になるわけですね。こんなん手作業で作ってられないのでRailsは偉大ですね

サーバーの起動

rails newをしたら今度はサーバーを起動します 別途ターミナルを立ち上げて下記の通り入力

$ rails server

するとこんな表示になります。
f:id:misokatsu_sand:20210203181814p:plain Ctrl+Cでサーバーを閉じるまではこの窓は開きっぱなしにします。
忘れると閉じられなくなるんで回りくどい操作が必要になってしまうそうな

次にブラウザでlocalhost:3000をアドレスバーに入力するとこんな画面が出ます。 これでサーバーが立ちました。 f:id:misokatsu_sand:20210204162806p:plain

トップページの自動生成
$ rails generate controller home top

このコマンドを実行するとトップページが自動生成されます メリットはまだ分かりませんがなにやら色々やってるのでただトップページを作るだけじゃないみたい f:id:misokatsu_sand:20210205004828p:plain この状態でlocalhost:3000/home/topをブラウザで開くといかにもデフォルトな感じのページが開きます f:id:misokatsu_sand:20210205005235p:plain

viewについて

Railsページにはview,controller,routingの3ファイルが必要で、
ブラウザの要求に対してRailsrouting>controller>viewの順に経由しviewを返します

viewは見た目の部分、つまりhtmlのことです
viewファイルは下図のディレクトリに入ってます。自動生成したhome/topも入ってますね f:id:misokatsu_sand:20210205010215p:plain

生成したtop.html.erbはhtmlのノリで編集できます。末尾にerbがついてますがhtmlと同じ記述らしい

controllerについて

先述の通り、Railsがブラウザにviewを返す前にcontrollerファイルを経由してきます。さてはサーバーサイドの処理だな?

rails generate controller home topで生成されたものの中にcontrollerと名のついた.rb拡張子のファイルがあります f:id:misokatsu_sand:20210205011333p:plain これの中身がこちら

class HomeController < ApplicationController
  def top
  end
end

home/topを生成したのに合わせてtopメソッドが書かれてます

このようにcontrollerに書かれたメソッドをactionといって、

routingについて

rountingはブラウザに入力されるURLとcontrollerをリンクさせるファイルです

[viewについて]で書いた流れを細かく書くと、
1.ブラウザからの要求に対しRailsがURLとroutingを参照
2.対応したcontrollerファイル名とそのactionを参照
3.そのaction名のviewとなるhtmlをブラウザに返す って感じですね

このroutingも自動生成されてます f:id:misokatsu_sand:20210205015623p:plain その中身がこちら

Rails.application.routes.draw do
  get 'home/top'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

あれ、Progateだとget "home/top" => "home#top"となりましたが結果が違う
ver.の違いでしょうか(Rails6.1.1)

コメントアウトに書いてあるURLへ行ってみると、どうやらURLの指定とcontroller actionが同じだと省略できるみたいです。なるほどね

ちなみに全然関係ないURLを入力したらrounting errorが出ました。

f:id:misokatsu_sand:20210205030216p:plain
やばそう
routingがうまく記述できてないとこうなるわけですね

routingの変更

controllerを呼び出すURLを変えます

Rails.application.routes.draw do
  get 'top'=>'home#top'
end

こうするとlocalhost:3000/topだけで呼び出せるようになります f:id:misokatsu_sand:20210205031150p:plain

また、下のように書いた場合はlocalhost:3000だけで呼び出せます

Rails.application.routes.draw do
  get '/'=>'home#top'
end
2個目以降のページの作成

home/topはrailsコマンドを使って自動生成しましたが、重複したcontrollerはコマンドが弾かれるため今まで書いたview,controller,routingファイルの自作が必要です

cssの適用

railsで下図のようにcss専用のフォルダが作られます f:id:misokatsu_sand:20210207184036p:plain home.scssがhomeフォルダのview全てに適用、
application.cssが全てのviewに適用されます

適用順はapplication>homeなので重複要素があればapplicationの記述は上書きされます

railsではscssなんですね。sass覚えといて良かった〜

画像の保存場所

railsは独特な参照をするみたいで、<img src="/bnr_mini.png">みたいな書き方をすると下図のフォルダを参照します。 f:id:misokatsu_sand:20210208233243p:plain 別にもapp/assets/imagesに保存場所があってどっちやねん!って感じですね
参照する際は/assets/images/xxx.pngのように記述します。appがルートディレクトリになるわけですね

ちらっと調べた感じwebアプリを立ち上げたとして、ユーザーが利用する範囲のものはpublic、システム画像などであまり変化のないものはassets/imagesに置くのがいいというのを見ました

htmlリンクの設定

htmlのaタグのリンク先にroutingのパスを記述するとその設定通りに飛ぶ

<a href="/">トップページ</a>

途中で調べることが多くて止まっちゃいましたがRails Iおわり!ではでは

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

どうも運動不足マンです

外に出ないせいで完全に冬眠モードです。実家なのでリングフィットやるスペースもないし困ったもんですね

さてやっていきましょうProgateのRuby Vです。Ruby単体はこれが最後ですね

クラスの継承
class Sushi < Food
end

継承の記述が左に流れるため紛らわしい

jsと同様に継承や上書きなどほとんど同じ概念がある
継承によって生成された子クラスにはインスタンス変数とインスタンスメソッドが継承されるところも同じ

また、子クラスで新規メソッドを記述すれば子クラスにのみ追加され、既存メソッドを記述すれば上書きされる

superメソッド
class Food
  attr_accessor:name

  def initialize(name:)
    self.name=name
    puts "#{self.name}が生成されました"
  end
end

class Sushi < Food
  attr_accessor:wasabi

  def initialize(name:,wasabi:)
    super(name: name)
    self.wasabi=wasabi
    puts "わさび#{self.wasabi}です"
  end
end

food1=Sushi.new(name:"ネギトロ",wasabi:"なし")

実行結果-----------------
ネギトロが生成されました
わさびなしです

super(name: name)の部分で親クラスの同名関数を呼び出してます

新しく定義した変数については通常通り記述

もうほぼjsでやった内容と同じですね

Dateクラス
require "date"
eventday=Date.new(2021,1,31)
puts eventday
puts eventday.sunday?

実行結果-------------
2021-01-31
true

定義しなくてもrequire "date"でDateクラスを読み込み、上記の流れでその日が何曜日か判定できる。 調べたところ、インスタンスメソッドは他にもたくさんあるみたい

また、下記のようにインスタンス生成の際に.newではなく.todayと記述することでその日の日付を取得できる

require "date"
eventday=Date.today
puts eventday

実行結果---------------------
2021-02-01
クラスメソッド

Date.newDate.todayのような記述をクラスメソッドと呼ぶとか呼ばないとか
クラスに対するメソッドなのでそのまんまですね
クラスメソッドを自前で用意するにはdef クラス名.メソッド名のように記述 以下お試し結果

require "date"

class Sample

  def Sample.is_today_sunday?
    today=Date.today
    if today.sunday?
      puts "今日は日曜日"
    else
      puts "今日は日曜日ではありません"
    end
  end

end

sample1=Sample.is_today_sunday?

実行結果-------------
今日は日曜日ではありません
クラスメソッドの連結

1つ上のコードは回りくどいなあと思って Date.today.sunday?みたいに記述できないかな?と気になって試してみたらできた
メソッドチェーンと呼ぶらしい jQと同じ呼び方ですね

require "date"

today1=Date.new(2021,1,31).sunday?
puts today1

today2=Date.new(2021,2,1).sunday?
puts today2

実行結果------------
true
false

これでRuby Vは終わり!次はやっとRailsですね 遅くね?

ではでは