2
2

【Rails】Railsチュートリアル 第4章 復習用

Last updated at Posted at 2024-07-24

はじめに

Railsチュートリアルで私が一番苦手な分野である第4章をアウトプットのために記述していく
最近プログラミング始めたビギナーなので間違いがあったら先輩方に訂正していただきたい
この記事をかなり参考にした
https://qiita.com/take_webengineer/items/265f29b77f3126d3a9df

単純なオブジェクト指向(?)のはなし

・クラスの下にインスタンスがある(Stringクラスの中に"foobar"という文字列がある)
・詳しくはこちらのサイトが解説している(スマホの例がわかりやすい) https://type.jp/et/feature/25261/
・メソッドとは、オブジェクトに渡されるメッセージ( "foobar".length のlengthがメソッド)
・Rubyはメソッドの引数のカッコ()を省略して記述できる。
・ハッシュがメソッド呼び出しの最後の引数である場合は、波カッコを省略できる

# メソッド呼び出しの丸カッコは省略可能。
stylesheet_link_tag("application", "data-turbo-track": "reload")
# 上は以下のように書いても同じ
stylesheet_link_tag "application", "data-turbo-track": "reload"
# 最後の引数がハッシュの場合、波カッコは省略可能。
stylesheet_link_tag("application", { "data-turbo-track": "reload" })
# 上は以下のように書いても同じ
stylesheet_link_tag("application", "data-turbo-track": 

クラス(まじ苦手)

class
    class Word < String             # WordクラスはStringクラスを継承する
        def palindrome?
          self == self.reverse        # selfは文字列自身を表します
        end
    end
        => :palindrome?
class
    s = Word.new("level")    # 新しいWordを作成し、"level" で初期化する
    => "level"
    s.palindrome?            # Wordが回文かどうかを調べるメソッド
    => true
    s.length                 # WordはStringで扱える全てのメソッドを継承している
    => 5

・このコードのWord.new("level")は、Wordクラスの直下に"level"文字列を入れるということ
・s = String.new("foobar")のときとイメージは同じ(このコードの意味はs = "foobar")
・超極論だがs = Word.new("level")は s = "level" である。(最後のコードは "level".lengthと同じだね)
・String→Word→level(文字列)と継承しているため、Wordクラス直下は文字列であり、文字列を扱えるすべてのメソッドを継承していることになる

眠いので朝起きたら続きの組み込みクラスから勉強する
→おきた

組み込みクラス

・組み込みクラスは元からRailsにあるクラス(Object,String等)
・組み込みクラスにメソッドを追加することは基本的にない
・ただRailsではデフォでblank?という空白を判定するメソッドがRubyに追加されている

ユーザークラス

User
class User
  attr_accessor :name, :email

  def initialize(attributes = {})
    @name  = attributes[:name]
    @email = attributes[:email]
  end

  def formatted_email
    "#{@name} <#{@email}>"
  end
end

・ルートディレクトリにrbファイルを作成し、その中でクラスの定義を行う(ルートディレクトリは一番上位のディレクトリ Sample_appの直下)

attr_accessor :name, :email

・このコードはユーザー名とメールアドレス(属性: attribute)に対応するアクセサー(accessor) をそれぞれ作成している
・これを作成する理由は、「外部から変数を参照するため」と「外部から変数を編集するため」です(外部とは違うファイルのこと)

もしこのコードがなかった場合

# Userインスタンスを作成
user = User.new('鈴木', 33)
# 下記のように外部から直接参照しようとするとエラーになる
puts user.name
# もしくは
puts user.age

外部からputsを使って参照しようとしてもエラーになり参照できない。

# Userインスタンスを作成
user = User.new('田中', 23)
# 下記のように外部から直接変更しようとするとエラーになる
user.name = '佐藤'
# もしくは
user.age = 45

変更の場合も同様で、 = を使って違う値を代入しようとしてもすることができない。

そこで先ほどのコードを記述することにより

# Userインスタンスを作成
user = User.new('鈴木', 33)
# 下記のように参照できるようになる
puts user.name #=> '鈴木'
puts user.age  #=> 33

# 下記のように変更できるようになる。
user.name = '田中'
user.age  = 56
puts user.name #=> '田中' 
puts user.age #=> 56

先ほどエラーが出たものも、外部から操作ができるようになる。
以上のコード含めこちらの記事を参照させていただいた
https://qiita.com/soicchi/items/5d64bc49d0e16c7602a3

  def initialize(attributes = {})
    @name  = attributes[:name]
    @email = attributes[:email]
  end

・このinitializeメソッドは、User.newが実行されると自動で呼び出される
・attributeという引数を1つ持っている
・attributes変数は空のハッシュをデフォルトの値として持つため、名前やメールアドレスのないユーザーを作ることができます。

  def formatted_email
    "#{@name} <#{@email}>"
  end

・これは文字列を生成するだけ
・名前 <メールアドレス>となる

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2