月別アーカイブ: 2021年11月

railsのまとめ6(ミニQ&Aサイトを作るその4)

5から続きます。

31:Postを押した時の保存処理の開発

rails routes #保存する際に必要な情報を見る
POST /questions/:question_id/answers(.:format) answers#create

app/controllers/answers_controller.rb

×だめな例
class AnswersController < ApplicationController

  def create
    @question = Question.find(params[:question_id])
    @answer = Answer.new
     if @answer.save
       redirect_to root_path, notice: 'Success!'
     else
       flash[:alert] = 'Save error!'
     render :show
   end
  end

   def edit
   end
end

viewに値を渡す必要がある変数の場合は、@を付ける。
逆に、viewに値を渡す必要がある変数の場合は@を付けない(付けても動作する)。
状況に応じて、使い分けをしているため、
やりたい処理によって付けたり付けなかったりする。
◯良い例

class AnswersController < ApplicationController

def create
  @question = Question.find(params[:question_id])
  @answer = Answer.new
    if @answer.update(answer_params)
      redirect_to question_path(@question), notice: 'Success!'
    else
      redirect_to question_path(@question), notice: 'Invalid!'
  end
end

  def edit
  end

private
  def answer_params
    params.require(:answer).permit(:content, :name, :question_id)
  end
end

ストロングパラメーター↑を作成しています。

32:Answerモデルのバリデーション

フォームに空で保存するのを禁止します。
app/models/answer.rbに記述↓

class Answer < ApplicationRecord
  belongs_to :question
    validates :content, presence: true
    validates :name, presence: true
end

33:回答一覧表示

app/views/answers/show.html.erbで記述を追加します。
<hr>

<div>
<h3>Answers</h3>
  <table class="table table-striped">
    <% if @question.answers.any? %>
      <thead class="thead-light">
        <tr>
          <td>Answer</td>
          <td>Name</td>
           <td>Menu</td>
        </tr>
      </thead>
   <tbody>
     <% @question.answers.each do |answer| %>
      <tr>
       <td><%= answer.content %></td>
       <td><%= answer.name %></td>
       <td>[edit] [Delete]</td>
      </tr>
    <% end %>
   </tbody>
  <% else %>
   <p>No answer yet.</p>
 <% end %>
</table>
</div>
@question = Question.find
#Quesutionsテーブルからfindしかしていないが

class Question < ApplicationRecord
  has_many :answers

回答一覧が表示されたらOKです。

続きを読む

railsのまとめ5(ミニQ&Aサイトを作るその3)

その4から続きます。

21:リファクタリング

app/views/questions/new.html.erbapp/views/questions/edit.html.erb
の大部分が同じ記述なのでDry原則を破っている
ではどうするか?共通化します。
app/questionsに新規ファイル
_form.html.erbを作成してカットペースト↓
※共通化して呼び出すファイルには_をつけるのがルール

<%= form_with model: @question, local: true do |f| %>
  <div class="form-group">
    <label>Name</label>
<!--テキストフィールドをつける-->
     <%= f.text_field :name, class: "form-control" %>
  </div>
<!--テキストフィールドをつける-->
  <div class="form-group">
    <label>Title</label>
     <%= f.text_field :title, class: "form-control" %>
  </div>
<!--テキストフィールドをつける-->
  <div class="form-group">
    <label>Content</label>
     <%= f.text_area :content, class: "form-control" %>
  </div>
<!--saveボタンを付ける-->
  <div class="text-center">
    <%= f.submit "Save", class: "btn btn-primary" %>
  </div>
<% end %>

app/views/questions/new.html.erbを↓のように編集します。

<div>
  <div class="col-md-4 offset-md-4">
<!--中央に寄せる設定-->
    <h2 class="text-center">New question</h2>
   <%= render 'form' %>
  </div>
 </div>

app/views/questions/_form.html.erb以下の記述にします。

<form action="/questions" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="aAhSPGiLYkFNeq6FyqkvGFyLFpLooxLsNyIdR4+/e+zq8FgqYyMlmNlWgruyu34AHg22g315u/gbC3GMDw63bw==" />
  <div class="form-group">
    <label>Name</label>
<!--テキストフィールドをつける-->
    <input class="form-control" type="text" name="question[name]" id="question_name" />
  </div>
<!--テキストフィールドをつける-->
  <div class="form-group">
    <label>Title</label>
     <input class="form-control" type="text" name="question[title]" id="question_title" />
  </div>
<!--テキストフィールドをつける-->
  <div class="form-group">
    <label>Content</label>
     <textarea class="form-control" name="question[content]" id="question_content">
     </textarea>
  </div>
<!--saveボタンを付ける-->
  <div class="text-center">
    <input type="submit" name="commit" value="Save" class="btn btn-primary" data-disable-with="Save" />
  </div>
</form>

続きを読む

railsのまとめ4(ミニQ&Aサイトを作るその2)

その3から続きます

11:新規質問機能の投稿View

app/views/questions/new.html.erbを↓のように記述

<div class="col-md-4 offset-md-4">
  <!--中央に寄せる設定-->
    <h2 class="text-center">New question</h2>
  <%= form_with model: @question, local: true do |f| %>
    <div class="form-group">
      <label>Name</label>
  <!--テキストフィールドをつける-->
  <%= f.text_field :name, class: "form-control" %>
    </div>
  <!--テキストフィールドをつける-->
    <div class="form-group">
      <label>Title</label>
   <%= f.text_field :title, class: "form-control" %>
    </div>
  <!--テキストフィールドをつける-->
   <div class="form-group">
     <label>Content</label>
   <%= f.text_field :Content, class: "form-control" %>
     </div>
  <!--saveボタンを付ける-->
     <div class="text-center">
   <%= f.submit "Save", class: "btn btn-primary" %>
     </div>
   <% end %>
</div>

form_with,text_field,submitなどのメソッドはフォームヘルパーと呼ばれフォームに関するhtmlを自動的に生成してくれます。

form_with
,はrails5.1になってからでてform_forなどは非推奨になったので移行しましょう。
model: @question
コントローラから渡されたクエスチョンモデルのモデルオブジェクトを設定
local: true 非同期通信を使ったフォームを無効にしている

次に動作確認をしたいのでコントローラからビューに
Questionモデルのインスタンスを渡す機能の実装

app/controllers/questions_controller.rbに↓のように記述

def new
  @question = Question.new
end

Questionモデルの新規インスタンスを生成して@questionに代入して
app/views/questions/new.html.erbに渡してform_withで利用しています。

form_withタグによって↓生成された
<form action=”/questions” accept-charset=”UTF-8″ method=”post”>
慣れるまではフォームヘルパーによってどんなHTMLタグができるか確認しましょう!
続きを読む

Railsのまとめ3(ミニQ&Aサイトを作るその1)

その2から続く

ミニQ&Aアプリを作ろう!

開発環境はCloud9で行う

0:ソフトウェアのアップデートをします。

sudo yum update

Rubyのバージョン確認

rvm -v
rvm install 2.5.1
rvm install 2.6.4
rvm list

ruby2.5.1を使う

rvm use 2.5.1

バージョン確認

ruby -v

2.5.1をデフォで使いたいとき

rvm --default use 2.5.1

rvm list

1:まず新規プロジェクトの作成

cd ~/environment/rails_projects
ls
rails -v
ruby -v
rails _5.2.1_ new qa

エラーを回避するためにgemfileのsqlite3の部分を追加↓

gem 'sqlite3', '~> 1.3.6'

# ~/environment/rails_projects/helloにいることを確認しsqlite3をアプデ

bundle update

2:データベースを作成する

rails db:create

レイルズサーバー起動
rails s

localhostで↓のようなものが確認できればOK

続きを読む

Railsのまとめ2(Hello World!)

1から続く

RailsでHelloWorldを表示させよう!

Rubyのバージョンチェックをする
ruby -v
#Rubyをインストールする
rvm install 2.5.1
rvm install 2.6.4
rvm list

#任意のバージョンを選ぶときは(今回は2.5.1を使う)

rvm use 2.5.1

#バージョンを確認
ruby -v

#2.5.1をデフォで使いたいとき

rvm --default use 2.5.1

#Railsがインストールされているか確認
rails -v
#Gemの確認
gem -v
#Railsをインストール
gem install rails --version="5.2.3" --no-document

バージョンチェック
rails -v

ディレクトリを作成する(rails_projects)

#まずは移動する
cd environment/

mkdir rails_projects

cd rails_projects/

#rails newで作成
rails _5.2.1_ new hello
cd hello/

データベースとしてパブリックドメインの軽量なものをインストール(sqlite)

#バージョン確認
sqlite3 --version

Gemfileに以下の記述を追加

'sqlite3', '~> 1.3.6'

Gemをインストールする

bundle install
bundle update

データベースを作成する

rails db:create

pumaというwebサーバが含まれている。

railsサーバを起動する。

rails s

このような表示がされているのを確認しよう


続きを読む

Railsのまとめ1(Rails概要)

①Ruby on Railsとは?

Rubyで書かれたオープンソースのウェブアプリケーションフレームワーク

フレームワークにはウェブアプリケーション開発に必要な基本的な機能が予め用意されている。

ある程度コードを書く際のルールが決まっている。

幅広いライブラリがGemと言う形式で公開されている。

主に使われているサイト

Airbnb:民泊サイト

GitHub:ソースコードバージョン管理

Square:決済

クックパッド:料理のレシピ共有サイト

freee: 会計ソフト

追記:他にも無数にあります

②Railsの基本理念

DRY原則(同じことを繰り返さない)

Don’t Repeat Yourself:DRY

設定より規約が優先される

クラスやデータベースの名付け方などのルールを守る

③MVCアーキテクチャーとは

M:Model(主にデータベース関連を担当する)

データの管理やビジネスロジックでデータの処理を行うコードを記載する。

ECサイトの例で話すと

商品が1つ売れたら在庫を1つ減らして、

購入履歴を保存するといったような処理はモデルに書くことになる。

静的なウェブページを表示するようなケースでは、モデルは必ずしも必要ではない。

静的なウェブページとは何度見ても誰が見ても同じコンテンツを返すだけの動きのないウェブページのこと。

動的なページはその逆で、ユーザーごとに見せるページが変わったりする。

例:Youtubeなど

V:View(主にHTMLを担当)

主にHTMLを作成する部分を担当する。

Webアプリケーションなので単純なHTMLではなく、

コントローラーを経由して渡されたデータを、HTMLに埋め込んでユーザのリクエストに応じて表示内容を変えて返すことになる。

RailsではデフォルトでERBと言う形式のテンプレートを使ってHTMLを書いていく。

このテンプレートを使うことによってHTMLの中にRubyのコードを埋め込むことができる。

追記:<%%><%=%>などを埋め込めるよ!

C:Controller(モデルとビューの仲介役)

ユーザからのリクエストを受けモデルとビューの仲介役をし、

最終的にユーザにページのコンテンツを返す役割を担っている。

追記:モデルからデータをもらいビューに使うよ!

2に続く

Rubyのまとめ6(プロテクテッドメソッド、モジュール、メソッドの公開範囲)

5から続く

プロテクテッドメソッド

class User

attr_reder :name 
  def initialize(name, deposit)
      @name = name
      @deposit = deposit
  end

  def bigger_than?(person)
      person.deposit < @deposit
  end
  protected

  def deposit
    @deposit
  end
end
  
suzutuki = User.new('suzutuki', 50000)
kunugi = User.new('kunugi', 30000)

suzutuki.bigger_than?(kunugi)
kunugi.bigger_than?(suzutuki) 
#.rbで出力すると
true
false

#クラスの外では呼び出せないよ
suzutuki.deposit
NoMethodError:

モジュール

クラスのようにメソッドや定数をまとめられるが
インスタンスが作れない、継承ができない
関連するメソッドや定数などをまとめてグループ化したいだけの時に、
手軽に使える。

module モジュール名
  #モジュールの定義 (メソッドや、定数など)
end
module Driver
  
  def self.run
    puts 'Run'
  end

  def self.stop
    puts 'Stop'
  end
end

Driver.run
Driver.stop
#.rbで出力すると
Run
Stop
# driver = Driver.new         #インスタンス生成できない
#   module TaxiDriver < Driver  #継承できない
# end
モジュールはインスタンス化できないのでself.でやる

 

module SampleNumber
  NUMBER = 300

  def number
    NUMBER
  end
end

puts SampleNumber::NUMBER
include SampleNumber
puts number
puts NUMBER

#.rbで出力すると
300
300
300

inncludeすることで定数をどちらでも呼び出せるようになる
module SampleModule

  def sum(a,b)
    a + b
  end

  module_function :sum
end

puts SampleModule.sum(4, 7)
ruby.module0.rbで出力
11
module SampleModule

  def sum(a,b)
    a + b
  end
end

class Port
  include SampleModule

  def call_sum(a, b)
    sum(a+ b)
  end
end

port = Port.new
puts port.sum(4, 7)
puts port.call_sum(8, 7)
#.rbで出力すると
11
15

include "モジュール名" でモジュールに定義されたメソッドを呼び出せる

例外と例外処理

puts '数値を入力してください'
i = gets.to_i
begin
#例外が起きうる処理
  puts 10 / i
  puts "begin's end"
  rescue => ex
#例外が発生した場合の処理
  puts 'error!'
  puts ex.message
  puts ex.class
  ensure
# 例外が発生しても、しなくても、最後に実行したい処理
  puts '終わり'
end
#.rbで出力すると
数値を入力してください
0
error!
divided by 0
ZeroDivisionError
終わり

puts “begin’s end”はエラー時は無視される
#実務ではよく使うので特に重要

例:2
[1] pry(main)> begin
[1] pry(main)* val = 10/ 0
[1] pry(main)* puts val
[1] pry(main)* rescue => e 
[1] pry(main)* p e.full_message
[1] pry(main)* p e.message
[1] pry(main)* p e.class
[1] pry(main)* end 

 1: from (pry):2:in `__pry__'\n(pry)
:2:in `/': \e[1mdivided by 0 (\e[4;1mZeroDivisionError\e[m\e[1m)\n\e[m""divided by 0"
ZeroDivisionError
=> ZeroDivisionError

メソッドの公開範囲

・public
誰からも見える
・protected
あまりつかわれない
・private
自分からしかみえない

class User

  def initialize(name)
    @name = name
  end

private
  def hello
    puts "Hello! I am #{@name}."
  end
end

suzutuki = User.new('suzutuki')
suzutuki.hello

#.rbで出力すると
Traceback (most recent call last):
access.rb:14:in `<main>': private method `hello' called for #<User:0x00000000010c4260 @name="suzutuki"> (NoMethodError)
suzutuki:~/environment/ruby_projects $ ruby access.rb

privateによってエラーが出る
privateをコメントアウトなどすると問題ない
Hello! I am suzutuki.
class User

  def initialize(name)
    @name = name
  end

  def say
     hello
  end

  private
    def hello
      puts "Hello! I am #{@name}."
    end
end

suzutuki = User.new('suzutuki')
suzutuki.say

def say hello endにより
#.rbで出力すると
Hello! I am suzutuki.
↑が出力されたので呼び出すことができた

バリデーションなどで使うので覚えておこう!

Rubyのまとめ5(クラスから継承まで)

4から続きます

クラス

オリジナルのクラスを作成する例:箱を定義するクラス
Boxクラス
メソッド hello ・・・ helloと出力する機能

class Box
  def hello
    puts 'hello'
  end
end

box = Box.new
box.hello

hello
class Box
  def initialize(name)
    puts 'initialize'
    @name = name 
  #インスタンス変数はインスタンス内であればどこでも使える
  #↑逆にこれは他では使えない
 end   

  def hello
    puts "Hello! I am #{@name}."
  end 
end

box = Box.new('Cardboard')
box.hello

wood = Box.new('wood')
wood.hello

#.rbで出力すると
initialize
Hello! I am wood.

更にインスタンスを追加することもできる

class Box
  def initialize(name)
    puts 'initialize'
  @name = name
end
  def hello
    puts "Hello! I am #{@name}."
  end
end

box = Box.new('Cardboard')
box.hello
wood = Box.new('wood')
wood.hello

#.rbで出力すると
initialize
Hello! I am Cardboard.
initialize
Hello! I am wood.

アクセサメソッド:インスタンス変数の値を読み書きするメソッドのこと

class Box
  def initialize(name)
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

  def name
    @name
  end
end

box = Box.new('Cardboard')
puts box.name

#.rbで出力すると
initialize
hello! I am Cardboard.
Cardboard

クラスの外からnameメソッドでインスタンス変数を呼び出した

インスタンス変数の@nameの値をクラスの外から書き換えたい

class Box
  def initialize(name)
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

  def name
   @name
  end
end
box = Box.new('Cardboard')
puts box.name
#.rbで出力すると
Cardboard
box.@name = 'suzutuki'
↑Syntax error インスタンス変数は外から書き換えられない

ではどうするか?書き込み用のメソッドを作る

class Box
  def initialize(name)
    # puts 'initialize'
  @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

#他の言語だとゲッターメソッド
  def name
    @name
  end
#他の言語だとセッターメソッド
  def name=(value) #←ここから
    @name = value
  end
end

box = Box.new('Cardboard')
# box.hello
puts box.name
box.name = 'suzutuki'
puts box.name

#.rbで出力すると
Cardboard
suzutuki

name=のように=で終わるメソッドを定義すると
変数に代入するような形でメソッドが呼び出される。
box.name = 'suzutuki'という書き方ができるようになる
メソッドを呼び出しているけれども
値('suzutuki')を代入するような書き方ができる。

インスタンス変数を読み書きするメソッドのことを
インスタンスメソッドと呼ぶ
設定を書き換えたいとき

アクセサメソッドattr_accessorメソッド
attrはattributeで属性のこと
インスタンスメソッドを開発者が書かなくて良くなる

class Box

attr_accessor :name
  def initialize(name)
    puts 'initialize'
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

# def name
#   @name
# end

# def name=(a)
#   @name = a
# end
end

box = Box.new('Cardboard')

puts box.name

box.name = 'suzutuki'
puts box.name

↓ruby accessor.rbで出力
Cardboard
suzutuki

class Box
  attr_accessor :name
end

box = Box.new
puts box.name
box.name = 'suzutuki'
puts box.name

#.rbで出力すると

suzutuki
※空欄はnilで初期引数を指定しないとなる

コメントアウトしているところを1行で書くことができる
定型文的なメソッドを毎回書かなくて良いので開発を効率化できる

読み込みのみしたいとき

class Box

attr_reader :name
  def initialize(name)
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

# def name
#   @name
# end

# def name=(a)
#   @name = a
# end
end

box = Box.new('Cardboard')
# box.hello
puts box.name
# box.name = 'suzutuki'書き込みをしようとするとエラーになる
puts box.name

↓ruby accessor.rb
Cardboard
Cardboard

↑書き込みがされてないので2回Cardboardが出力された
なお書き込もうとするとエラーが出る↓
accessor.rb:26:in `<main>': undefined method `name=' for #<Box:0x00000000021c7df0 @name="Cardboard"> (NoMethodError)
Did you mean? name

書き込みのみしたいとき

class Box

attr_writer :name
  def initialize(name)
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

# def name
#   @name
# end

# def name=(a)
#   @name = a
# end
end

box = Box.new('Cardboard')
# box.hello
# puts box.name
box.name = 'suzutuki'
# puts box.name

#.rbで出力すると
何も起きてないように見えるが書き込みはされている。表示はされない

クラス変数:クラス自体に値を保持できる変数

class Box

@@count = 0
  def initialize(name)
    @name = name
    @@count += 1
  end

  def hello
    puts "Hello! I am #{@name}. #{@@count} instance(s)."
  end
end

kit = Box.new('Cardboard')
kit.hello

wood = Box.new('wood')
wood.hello

suzutuki = Box.new('suzutuki')
suzutuki.hello

#.rbで出力すると
Hello! I am Cardboard. 1 instance(s).
Hello! I am wood. 2 instance(s).
Hello! I am suzutuki. 3 instance(s).

クラスメソッドinfoを定義、クラスメソッドinfoを実行すると
インスタンスの生成回数(@@count)を出力する

class Box

@@count = 0
  def initialize(name)
    @name = name
    @@count += 1
  end

  def hello
    puts "Hello! I am #{@name}. #{@@count} instance(s)."
  end

  def self.info
    puts "#{@@count} instance(s)."
  end
end

Box.info
#.rbで出力すると
0 instance(s).

↑インスタンスの生成が行われていないので0
class Box
  
@@count = 0
  def initialize(name)
    @name = name
    @@count += 1
  end
  
  def hello
    puts "Hello! I am #{@name}. #{@@count} instance(s)."
  end

  def self.info
    puts "#{@@count} instance(s)."
  end
end

kit = Box.new('Cardboard')
Box.info

wood = Box.new('wood')
Box.info

suzutuki = Box.new('suzutuki')
Box.info

#.rbで出力すると
1 instance(s)
2 instance(s)
3 instance(s)

一つのクラス変数@@countをそれぞれのインスタンスが共通して
利用していることがわかる

class FF
  def self.first_method
    puts '1'
  end

  class << self
    def second_method
     puts '2'
    end
    
    def third_method
      puts '3'
    end
   end
end

FF.first_method
FF.second_method
FF.third_method

#.rbで出力すると
'1'
'2'
'3'

FF.new.varだとエラー
オブジェクトからクラスメソッドを呼び出そうとしてもエラーになる

 

クラスと定数

class Box
REGION = 'USA'
@@count = 0
  def initialize(name)
    @name = name
    @@count += 1
  end

  def hello
    puts "Hello! I am #{@name}. #{@@count} instance(s)."
  end
  
  def self.info
    puts "#{@@count} instance(s). Region: #{REGION}"
  end
end

kit = Box.new('Cardboard')
Box.info

wood = Box.new('wood')
Box.info

suzutuki = Box.new('suzutuki')
Box.info

puts Box::REGION
クラスの外から呼び出せる

#.rbで出力すると
1 instance(s). Region: USA
2 instance(s). Region: USA
3 instance(s). Region: USA
↓putsがあるので4番目のUSAも出力されている。ないと3行まで
USA

クラスの継承

親クラスを作成することで親クラスの機能を引き継いで、
子クラスを作成することができる。
コードの再利用性や拡張性を高める仕組み

#親クラスのUserを作る
class User
  def initialize(name)
    @name = name
  end
  
  def hello
    puts "Hello! I am #{@name}"
  end
end

akina = User.new('akina')
akina.hello
#.rbで出力すると
Hello! I am akina
class AdminUser < User
#子クラスまたはサブクラスを作った
  def hello_admin
    puts "Hello! I am #{@name} from AdminUser."
  end
end
suzutuki = AdminUser.new('suzutuki')
suzutuki.hello
suzutuki.hello_admin

#.rbで出力すると
Hello! I am akina
Hello! I am suzutuki
Hello! I am suzutuki from AdminUser.

 

class User
  def initialize(name)
    @name = name
  end

  def hello
    puts "Hello! I am #{@name}"
  end
end

#子クラスまたはサブクラスを作った
class AdminUser < User
  def hello_admin
    puts "Hello! I am #{@name} from AdminUser."
  end
#↓helloメソッドをAdminUserの方でオーバーライドする
  def hello
    puts 'Admin!!'
  end
end

suzutuki = AdminUser.new('suzutuki')
suzutuki.hello
suzutuki.hello_admin

#.rbで出力すると
Admin!!
Hello! I am suzutuki from AdminUser.

親クラスから小クラスのメソッドは呼び出せないのに注意!

子クラスを編集することにより親クラスに変更を加えることなく
子クラスに機能を追加したり上書き(オーバーライド)することができる!

class User
 def initialize(name)
   @name = name
 end
 def hello
   puts "Hello! I am #{@name}"
 end
end

class AdminUser < User
 def hello_admin
   puts "Hello! I am #{@name} from AdminUser."
 end
 #↓helloメソッドをAdminUserの方でオーバーライドする
 def hello
   super
   puts 'Admin!!'
 end
end

suzutuki = AdminUser.new('suzutuki')
suzutuki.hello
akane = AdminUser.new('akane')
akane.hello

#.rbで出力すると

Hello! I am suzutuki
Admin!!
Hello! I am akane
Admin!!

親クラスのUserクラスのhelloも呼び出されている!

Integerの継承関係から継承関係を見ることができる

BasicObject
↑
Object
↑
Numeric
↑
Integer
#superclassで親クラスを知ることができる
Integer.superclass
=> Numeric
2.5.1 :002 > Numeric.superclass
=> Object
2.5.1 :003 > Object.superclass
=> BasicObject
2.5.1 :004 > BasicObject.superclass
=> nil

6に続く

Rubyのまとめ4(繰り返しからnext, whileまで)

3から続く

繰り返し処理 Each for

配列やハッシュ.each do |変数|
  #繰り返し実行したい処理
end

例1

#1:配列 numbersを作成(1,2,3,4,5)
numbers = [1, 2, 3, 4, 5]
#2:配列の要素を一つずつ取り出して実行
numbers.each do |number|
  puts number
end

別解1
numbers.each {|number|
  puts number
}
#一行でもかける
numbers.each {|number| puts number }

↑配列が入っている要素は複数形||の中の変数は
単数で書くことが多いらしい

配列 colors を作成
‘red’, ’green’ ’blue’

配列の要素を一つずつ取り出して出力

colors = ['red', 'green', 'blue']

colors.each do |color|
    puts color
end

red
green
blue
=> ["red", "green", "blue"]
#繰返処理 for構文

for 変数 in 配列やハッシュ do
 #繰り返し実行したい処理
end

1:配列 numbersを作成(1,2,3,4,5)
2:配列の要素を一つずつ取り出して実行

numbers = [1, 2, 3, 4, 5]

for number in numbers do
  puts number
end

forは原則使わないらしい

each (ハッシュ利用)

1:ハッシュで生徒ごとの点数scoresを用意
{luke: 100, ben: 90, alan: 70 }
配列の要素を一つずつ取り出して出力

scores = {luke: 100, ben: 90, alan: 70}

scores.each do |k, v|
  puts v
end

#出力されるもの
100
90
70

両方取り出したいとき↓

scores = {luke: 100, ben: 90, alan: 70}

scores.each do |k, v|
  puts "#{k}, #{v}"
end

#出力されるもの
luke, 100
ben, 90
alan, 70

80点以上を取り出したいとき↓ifをeachに追加

scores = {luke: 100, ben: 90, alan: 70}

scores.each do |k, v|
  if v >= 80
    puts "#{k}, #{v}"
  end
end

luke, 100
ben, 90

繰り返し処理 times

繰り返し回数.times do |i|
  繰り返し実行したい処理
end
|i|は省略可能
5.times do
  puts 'Hello'
end

Hello
Hello
Hello
Hello
Hello

ダブルクオートで囲んだとき

5.times do |i|
  puts "#{i}: Hello"
end

0: Hello
1: Hello
2: Hello
3: Hello
4: Hello

上も下も同じ意味
5.times { |i| puts "#{i}: Hello" }

繰り返し処理(while)

while 条件式 do
  繰り返し実行したい処理
end

数字を0から9まで、10個出力するプログラム。whileを使って書く

i = 0

while i < 10
  puts "#{i}:hello"
    i += 1 #i = i + 1
end
#出力されるもの
0:hello
1:hello
2:hello
3:hello
4:hello
5:hello
6:hello
7:hello
8:hello
9:hello

無限ループが起きることがあるので気をつけよう

uptoとdownto

開始値.upto(終了値){繰り返し実行したい処理}

10.upto(14) {|n| puts n }
14.downto(10) {|n| puts n }


10
11
12
13
14

14
13
12
11
10

繰り返し処理step

開始式.step(上限値,一度に増減する大きさ){}

1.step(10, 2) { |n| puts n }

1
3
5
7
9
減らすときはマイナスで
10.step(1, -2) { |n| puts n }

10
8
6
4
2

繰り返し処理(loop)

loop do
 繰り返し実行したい処理
end

loopメソッドを使って、変数の値を0から1ずつ増やして出力

i = 0

loop do
  puts i
  i += 1
 #breakがないと無限ループに突入するので注意!
  break if i == 10 
end
0
1
2
3
4
5
6
7
8
9

whileの場合

n = 0

while true
 puts ncf
 n += 1
end

応用)配列[1,2,3,4,5,]の値が、奇数の場合のみ、画面に出力する処理。

eachとnextを利用

numbers = [1, 2, 3, 4, 5]

numbers.each do |n|
 next if n % 2 == 0 
#もしnが偶数だったらループをスキップするという意味

#上と下は同じ意味だで
next if n.even?

#奇数の時はodd
next if n.odd? 
  puts n
end

#出力されるもの
1
3
5

5に続きます。