LoginSignup
17
12

More than 5 years have passed since last update.

ruby on rails 学習メモ

Last updated at Posted at 2017-05-31

新しくRuby on Railsを勉強し始めたのでメモ。
今まで学んだ言語(php, python, javascript)にはなかったものを中心に。

2017.6.1追記
scivolaさんの大変勉強になるコメントを元に修正しました。

ruby記法

returnを省略可能

rubyではreturnを省略可能。最後の式が暗黙的にreturnになる

def ok()
    "ok google" # return "ok google" と同意
end

ok # "ok google"

メソッドの()を省略可能

rubyではメソッドの()を省略可能。 ただしそれはメソッドの定義で初期値を設定している場合のみ。例えば def(i=0,w="")など。これは引数がある場合でも同意

def ok(w1 = "", w2 = "")
    "ok! #{w1} and #{w2}"
end

ok("one","two")
# ok! one and two
ok "one","two"
# ok! one and two

変数のスコープ

変数の文頭の記号によってスコープを設定している

グローバル変数($)

一番大きなスコープ。プログラム内で一意

$global_v = 'hoge'

 def test
    $global_v += 'fuga'
 end

 test # hogefuga

 puts $global_v # hogefuga 

インスタンス変数(@)

インスタンの中で一意

# クラスの定義
class Person
    def initialize(name)
        @name = name
    end
    def print_name
        puts @name
    end
end

# インスタンの作成
one = Person.new('hoge')
two = Person.new('fuga')

# 変数の確認
one.print_name # hoge
two.print_name # fuga 

クラス変数(@@)

クラス内で一意。インスタンス変数との違いに注意。

# クラスの定義
class Person
    def initialize(name)
        @@name = name
    end
    def print_name
        puts @@name
    end
end

# インスタンの作成
one = Person.new('hoge')
two = Person.new('fuga')

# 変数の確認
one.print_name # fuga
two.print_name # fuga

ローカル変数

一番狭い。定義された関数の中でのみ有効。


def test1
    test = 'hoge'
    puts test
end

def test2
    test = 'fuga'
    puts test
end

test1 # hoge
test2 # fuga
puts test # error

範囲

1..10のように書くことで1,2,3,4,5,6,7,8,9,10という範囲を定義できる。pythonのrange(1,10)と似ている。for文とか、配列の作成で使う。

# forでの利用
for i in 1..10
    puts i
end

# 配列への展開で利用
(1..3).to_a # [1,2,3]

# オブジェクトを明示的に宣言
Range.new(1,3) == (1..3) # true

後続if

処理の後ろにifを書くことで、条件に一致した場合のみ処理を行うということができる

x = 0

1 + 2 if x > 1 # nil
1 + 2 if x < 1 # 3

語尾に?がつくメソッドはBooleanを表す

empty?やinclude?などの true,falseで値を返すメソッドについては?がついている。 返り値の真/偽を伺うためのメソッド(返り値を条件式に用いるメソッド)に?が付いている。あくまで慣習。

a = "test"
puts "a is empty" if a.empty? #nil

b = [3,4,5]
puts "include 5" if a.include?(5) # include 5

unless構文

ifの逆で判定が偽の場合のみ処理を実行する。

x = 0

unless x > 1 then
    puts "ok"
else
    puts "no"
end

# "ok"

module

ヘルパー関数(独自関数?)をまとめるもの。module ApplicationHelperを指定するとrailsでは自動的に全てのviewで使える。

module ApplicationHelper

    def test()

    //処理

    end
end

配列の処理

<<で 配列 要素の追加。チェーンすることもできる

a = [1,2]
a.push(3) # [1,2,3]
a << 4 << 5 # [1,2,3,4,5]

数値(文字)..数値(文字)で範囲を表す。

範囲は数値、又はアルファベットの範囲を表す。1..10なら1から10まで。アルファベットで"a".."z"のような記述も可能。

数値を配列に変換。to_aメソッド

a = 0..9
b = (a).to_a # [1,2,3,4,5,6,7,8,9]

配列からカット

a = [22,33,44,55,66]
a[2..4] # 44,55,66

ブロック

よくわからん
{}で囲んで、||で変数を宣言。その後ろで処理。
doとendで囲んでもOK。 do endはrailsのtestのプログラムで使われてる

例文)範囲の各要素に対して2をかけて、それを出力する

# {}の時
(1..3).each{ |i| puts i * 2}
# do endの時
(1..3).each do |i|
    puts i * 2
end

# 2
# 4
# 6

例文)配列の各要素を自乗する。mapメソッド

a = [1,2,3]
a.map{ |i| i**2}
# [1,4,9]

例文)省略記法

変数を単体で使う場合は&:を使って省略して記入できる。
ただし、その場合は{}ではなくふつうの関数と同じく()になるので注意。

a = [1.2,2.3,3.3]
a.map(&:ceil)
# [2,3,4]
# a.map{ |i| i.ceil }と同意

%記法

"や'の代わりに使用できる。"と'をエスケープする必要がない。%, %w, %Wやらいろいろ種類がある。後ろの記号()はなんでもよし。
ここがわかりやすい

x = ryo
# 文字列 変数展開
a = %(#{x} is best friend) 
# ryo is best friend

# 配列へ格納 式の展開なし
b = %w(ryo kei tuka)
# [ryo, kei, tuka]

ハッシュ(連想配列)

連想配列のことをハッシュという。 配列と違って並び順は固定ではない。 ruby1.9からは並び順も固定。
リテラル記法では=>を使って要素を宣言できる。
{}を使うがブロックとは異なるので注意。

# 空の配列
user = {}

# 要素の定義
user["one"] = "ryo" # { "one" => "ryo"}

# 要素の定義(リテラル記法)
user = { "one" => "ryo", "two" => "yu"}

ハッシュでもeachメソッドとブロックが利用可能。ハッシュの場合は変数を2つ持つ

a = { one:"hello", two:"goodby" }
a.each do |key,value|
    %(#{key}と#{value})
end

# oneとhello
# twoとgoodby

シンボル

ハッシュのキーで使われることが多いらしい。:を文頭につける
数字で始まったり空白文字を含むシンボル名の場合は""で囲む

# ハッシュで利用
a = { :one => "ryo", :two => "you" }

# railsでハッシュのキーとしてシンボルを使う場合以下のような省略記法を使う。
b = { one:"ryo", two:"you" }

# a == b


# 空白文字を含むシンボル
:"test test"
# 数字で始まるシンボル
:"1d"

stylesheet_link_tag の解説

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

これを解くには
- メソッドの()は省略可能
- 引数の最後がハッシュの場合は{}が省略可能
- 引数の途中で改行可能
というのを知る必要がある。

上を省略せず書くと

<%= stylesheet_link_tag('application', {media: 'all', 'data-turbolinks-track': 'reload'} %>

となる。第一引数でstylesheetoのパスを送り、ハッシュでメディアタイプとturbolink?を送っている。
なぜこんな分かりづらい記法なのだろう。。
改行が適切だと({でネストするより分かりやすい。

実行すると以下になる

<link data-turbolinks-track="true" href="/assets/application.css" media="all"
rel="stylesheet" />

classの継承

class hoge < foo の < でhogeクラスがfooクラスを継承していることを表す

# fooクラスの定義
class Foo
    def ok
        puts "ok"
    end
end

# fooクラスを継承したhogeクラスの定義
class Hoge < Foo
    def bad
        puts "bad" 
    end
end

# インスタンスの作成
test = Hoge.new

# 実行
test.ok # ok
test.bad # bad

組み込みクラスの拡張が可能

rubyではたとえ組み込みのクラスでも拡張が可能。

アクセリー

勉強中、getterとかsetterとかまだ理解できてない。

Railsの記法

aタグを生成(link_to)

<%= link_to "Home", "./hoge", id:"test" %>

# 生成されるタグ
# <a href="./hoge" id="test">Home</a>

imageタグの生成(link_to image_tag)

<%= link_to image_tag("rails.png", alt: "Rails logo"),
            'http://rubyonrails.org/' %>

# 生成されるタグ
# <img alt="Rails logo" src="/assets/rails-9308b8f92fea4c19a3a0d8385b494526.png" />
# src末尾の連番はrailsが自動的に付与する

パーシャル

htmlのレイアウトを分割することができる。パーシャルのファイルはファイル名の頭に'_'をつける。

レイアウト

'''layout/_test.html.erb

パーシャルです


```

パーシャルの読み込み

layout/application.html.erb
.
.
<%= render 'layout/test' %>
.
.

アセットパイプライン

railsがassetsをまとめてくれる。読み込み時間の短縮。scssとかcoffeescriptとかの自動コンパイルも。
なんて便利なんだ。

名前付きルート

routeで指定したページのurlをhoge_path、hoge_urlなどのように

17
12
2

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
17
12