ぷろぐらみんぐ学習帳

プログラミング初心者の学習記録です。2020年12月に勉強開始。

【Ruby】配列とハッシュ、それぞれの値の取り出し方

配列とハッシュが混在しているとき値の取り出し方が混乱したのでまとめました。

 

<配列>

student = ["taro", "ichiro", "jiro"]
puts student [1]
# => ichiro

 

<ハッシュ>

profile = {age: 12, height: 160, weight: 50}
puts profile [:age]
# => 12 

 

<配列のなかにハッシュ>

student_profile = [
{name: "taro", age: 12, height: 160, weight: 50},
{name: "ichiro", age: 13, height: 140, weight: 40},
{name: "jiro", age: 18, height: 170, weight: 60}
]

puts student_profile[1]
# => {:name=>"ichiro", :age=>13, :height=>140, :weight=>40}

puts student_profile[1][:age]
# => 13
 
<ハッシュのなかにハッシュ>
taro = {family: {mother: "mama", father: "papa"}, age: 12, height: 160, weight: 50}
puts taro[:family][:mother]
# => mama
 
値の取り出し方は配列もハッシュも似ているな。。。
ハッシュはシンボルで記載するくらい。
keyとvalueの関係をわかっていれば、順番に記載するだけかな。

【Rails】ターミナルで「rails routes」を使うタイミング

ターミナルのrails routesで読み方迷子にならないようメモ。間違いがあればご指摘してくださると嬉しいです。

 

rails routesを記述したとき

こんな表示がでますね。そもそもどんなときにrails routesって使うっけー??という疑問に答えがすっとでてこなかったので、このままでは使いこなせないと思い記事にすることにしました。

 

Railsガイドによると、「現在のアプリケーションで利用可能なルーティングを表示する(既存のルールを一覧表示にする)」ときに使うようです。https://railsguides.jp/routing.html 

 

そもそもルーティングとは「HTTPリクエストを受け取ったときに、そのリクエストを適切なコントローラーとその中のアクションに割り振る」でした。なので、HTTPリクエスト(HTTPメソッド・URLパターン)とコントローラーとアクションの対応関係の一覧ということです。

 

なのでプログラムを記述する際に、「あれ、フォームに記載した情報を投稿するリンク貼りたいけどここには何のURLパターンを記述すればいいっけ?」などとなったときにターミナルでrails routesを実行したら答えを教えてくれます。特にresourcesメソッドでルーティングを生成すると詳しくルーティングを記述せずに済んでしまうので、このときrails routesで確認するとよさそうですね。

 

 

・Verb:HTTPリクエストで送られてくるHTTPメソッド

・URL Pattern:HTTPリクエストで送られてくるURLパターン(Prefixと一対一対応)

・Controller#Action:振り分けられるコントローラーとその中のアクション

 

少しずつ使いこなしたいものです。それでは今日はこのあたりで。

【Rails/命名規則】超基本メモ

命名規則ってただの慣例?守らないと不都合ある?」ってことでRailsガイドを参考にして自分用にまとめました。

 

<コントローラーの命名規則> https://railsguides.jp/action_controller_overview.html

基本的に複数形にする

ただし絶対守らないといけないわけではない

・複数形のメリット:

 resoursesなどのデフォルトのルーティングジェネレータがそのまま利用できる。

 名前付きルーティングヘルパーの用法がアプリケーション全体で一貫する。

 

<モデルの命名規則> https://railsguides.jp/active_record_basics.html

モデルは単数形(クラスは先頭が大文字)、対応するDBのテーブルは複数形

Railsでは、データベースのテーブル名を探索するときに、モデルのクラス名を複数形にした名前で探索するから

 

<ビューの命名規則> https://railsguides.jp/action_view_overview.html

・アプリケーションのapp/viewsディレクトリには、1つのコントローラごとに1つのディレクトリが作成される。

・例(※この部分は自作):「app/controllers/tweets_controller.rb」ファイルに対するビューディレクトリは「app/views/tweetsディレクトリ。このなかに対応するコントローラのアクションに応じてビューファイル(index.html.erbなど)を作成する。→ でもビューファイルはrails g controller コントローラー名でコントローラー作成したときに自動でビューファイルで作成されるからあまり悩まないか。

 

命名規則はもっとありそうですが、今回はこのくらいで。。。

その他参考記事

http://www.code-magagine.com/?p=8682

http://www.code-magagine.com/?p=8682

https://techacademy.jp/magazine/22331

 

「インスタンス変数.カラム名」で目的のカラムのデータを取り出せる理由(Ruby on Rails)

こんばんは。Ruby on Railsの勉強中にわいた疑問です。

DBのカラム名textのデータを表示させるため、モデルに「@tweet = Tweet.find(params[:id])」、ビューファイルで「@tweet.text」の記述しただけで目当てのデータが取り出せたことに対して「え?.textって何?メソッド?カラム名」となったため調べました。

 

いざ調べてみると、やはり同じ疑問を持つ方はいました。

https://qiita.com/yamayu_504/items/ad6ebe21226686391c47

 

こちらも参考になります。

https://qiita.com/Asama334/items/6fb79e4890a5118d8dee

 

一言でいうと「Ruby on Railsではカラムのデータを取り出すための、カラム名と同じ名前のメソッドが自動で作られている」らしい。それがこの場合でいう.text

 

具体的にいうと

① @tweet = Tweet.find(params[:id])に対応する、各カラムのインスタンス変数(例えば@text= textカラムの値 )が自動で生成。

② 「def text   @text   end」というtextメソッドが自動で定義。

③ そのtextメソッドを使って(@tweet.text)、インスタンス変数@tweetからtextカラムのをよびだす。

 

Ruby on Railsで①②が自動に実行されるのは、ActiveRecordの機能(ActiveRecord::Base)のようです。@tweet.textの背景にこんなことが隠れているとは。。。!

 

理解しきれていないと思いますが、今日も勉強になりました🐥🐥🐥

 

変数の整理(Ruby)

変数が入り混じったときよく混乱します。

よく私が悩むポイントは

・どの範囲まで有効か(スコープ)

・どうやって見分けるか

 

なので、上記を意識して整理しました。

 

グローバル変数

プロジェクト内どこでも有効。

先頭に$をつける。

あまり使われない

 

 ●インスタンス変数

宣言されたクラス内ならどのメソッドでも有効。

インスタンスごとに値は異なる。

先頭に@をつける

 

●ローカル変数

宣言されたメソッド内やブロック内でのみ有効。

定義のとき先頭に何もつける必要はない

 

→「普段何気なくみているただの(?)変数はローカル変数」ということを改めて認識!ちなみに有効範囲(スコープ)でについては有効範囲の外で同じ名前の変数がでてきても、別の変数として認識される」という説明がいちばんしっくりきました。

 

 

例その①

name = "Tanaka"

def sample

   puts name ←ローカル変数nameの有効範囲内。同じ変数nameとして認識。

end 

sample

→ Tanaka と表示

 

 

例その②

def sample

   puts name 

end

name = "Tanaka" ← ローカル変数nameの有効範囲外異なる変数として認識

sample

→ エラー

 

ローカル変数の例をだしましたが、私は今Ruby on Railsの勉強中で、インスタンス変数(@~)もよくでてきます。インスタンス変数は同じクラス内なら異なるメソッドでも同じ変数として認識されることを考えると、index,new, editなどのアクション(同じアクションのコントローラーとビューで同じ変数を扱う)でインスタンス変数が使われている理由がわかりました。

 

以上です。書いてみると当たり前のこと書いてしまったかも。。。でも勉強になったのでこれからもアウトプット少しずつ頑張ります😁

 

Rubyにおけるメソッド(分類とか書き方とかの整理)

かなり混乱してきたので調べて整理しました。誤りがあればご指摘お願いします。

 

●メソッドとは●

オブジェクト指向における「操作」を定義したもの

Rubyでは全ての操作がメソッドとして実装されている

 

メソッドの実行の流れ

 オブジェクトにメッセージを送る → オブジェクトがメッセージを受け取る

 

そのためメソッドにおけるオブジェクトレシーバーとも呼ばれる。

 

●メソッドの分類● ← レシーバーで分類

インスタンスメソッド

・クラスメソッド

・関数的メソッド

 

インスタンスメソッド>

メソッドのレシーバーがインスタンスのとき。いちばんよく見る。

 

<クラスメソッド>

メソッドのレシーバーがクラスであるとき。

インスタンスを生成するメソッド(クラス名.new)など。

RailsActiveRecordメソッドも

 

<関数的メソッド>

レシーバーがない(本当はあるが記述しない)メソッド。putsとか。

 

 

 

●書き方(定義と呼び出し)●

インスタンスメソッドとクラスメソッドについて

 

〜だめな例〜

class Calculation

    def addition(a, b, c) ←これはインスタンスメソッド

        puts a + b + c

    end

end

 

addition(1,2,3) ← メソッドを呼び出すときはメソッド名だけ書いても✗

 

 

〜正しい書き方①:クラスメソッドとして〜

class Calculation

    def self.addition(a, b, c) ← self.メソッド名(仮引数)

        puts a + b + c

    end

end

 

Calculation.addition(1,2,3)  ← クラス名.メソッド名(実引数)で呼び出し

 

〜正しい書き方②:インスタンスメソッドとして〜

class Calculation

    def addition(a, b, c) ← メソッド名(仮引数)

        puts a + b + c

    end

end

 

calculation = Calculation.new  ← まずインスタンスを生成

calculation.addition(1,2,3) ← インスタンス.メソッド名(実引数)で呼び出し

 

定義や分類については「たのしいRuby 第6版」を参考にしました。

少しすっきり〜!

 

ライブラリ関連ざっくりメモ(Ruby)

ほぼ自分用の超ざっくりメモです。

厳密には正しくないかもしれませんが、イメージで。。。

明らかに間違っていたら指摘お願いします。

 

●ライブラリ

プログラムを作るための部品をいっぱい集めたファイル

 

●Gem

Rubyで使われるライブラリ

 

RubyGems

Rubyのライブラリ(つまりGem)を管理するシステム

 

●Gemfile

Ruby on Railsアプリケーション内にあるファイルで、アプリケーションで使用するGemの情報(名前、バージョン)を記載する。

 

●Gemfile.lock

Ruby on Railsアプリケーション内にあるファイルで、Gemfileで設定したGemと依存関係にあるGemの情報について設定している。(bundlerによってGemをインストールすると自動的に記載されるので自分で記載する必要なし)

 

●bundler

Gemのひとつで、GemfileGemfile.lockに従って、Gemを管理する。

依存関係にあるgemのインストールやgemのバージョン管理ができる。