LoginSignup
0
0

More than 3 years have passed since last update.

Railsチュートリアル 第4章

Posted at

Railsコンソールの設定

Railsコンソールはirb(IRB:Interactive RuBy)を拡張して作られているため、Rubyの機能を全て使うことができる。

$ nano ~/.irbrc

下記の設定を書くと、irbのプロンプトが簡潔な表示に置き換わる。

IRB.conf[:PROMPT_MODE] = :SIMPLE
IRB.conf[:AUTO_INDENT_MODE] = false

後続ifとunless

if:条件式が"真"のときに実行される

puts "x is not empty" if !x.empty?

unless:条件式が"偽"のときに実行される

>> string = "foobar"
>> puts "The string '#{string}' is nonempty." unless string.empty?
The string 'foobar' is nonempty.
=> nil

メソッド

mapメソッド

配列の要素の数だけブロック内の処理を繰り返し、結果として作成された配列を返す。
map!は元の値を書き換える。

オブジェクト.map { |変数|
  # 実行したい処理
}
>> (1..5).map { |i| i**2 }
=> [1, 4, 9, 16, 25]
>> %w[a b c]      # %w で文字列の配列を作成
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]

mapのブロック内で宣言した引数(char)に対してメソッドを呼び出している場合は、省略記法が一般的。

>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]

to_a

配列に変換する

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

%w

文字列の配列に変換

>> a = %w[foo bar baz quux]         # %wを使って文字列の配列に変換
=> ["foo", "bar", "baz", "quux"]
>> a[0..2]
=> ["foo", "bar", "baz"]

ブロック

下記では、範囲オブジェクトである(1..5)に対して、eachメソッドを呼び出している。
メソッドに渡されている{ |i| puts 2 * i }が、ブロックと呼ばれる部分。

>> (1..5).each { |i| puts 2 * i }

また、ブロックである事を示すには波カッコで囲むが、下記のようにdoとendで囲んで示すこともできる。
短い1行のブロックには波カッコを使い、長い1行や複数行のブロックにはdo..endを使う。

>> (1..5).each do |i|
?>   puts 2 * i
>> end

そう考えると、単体テストもブロックであることがわかる。
このtestメソッドは、文字列(説明文)とブロックを引数にとり、テストが実行されるときにブロック内の文が実行されている。

test "should get home" do
  get static_pages_home_url
  assert_response :success
  assert_select "title", "Ruby on Rails Tutorial Sample App"
end

ハッシュ

ハッシュは本質的には配列と同じだが、インデックスとして整数値意外のものも使える点が配列とは異なる。(そのため、他の言語ではハッシュを連想配列と呼ぶこともある)
ハッシュは、キーと値のペアを波カッコで囲んで表記する。
配列と似ているが、ハッシュでは要素の並び順が保証されないため、要素の順序が重量である場合は、配列を使う必要がある。

>> user = { "first_name" => "Michael", "last_name" => "Hartl" }
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}

上記では、ハッシュのキーとして文字列を使っていたが、Railsでは文字列よりもシンボルを使うのが一般的。:nameのように表す。

>> user = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> user[:name]              # :name に対応する値にアクセスする
=> "Michael Hartl"
>> user[:password]          # 未定義のキーに対応する値にアクセスする
=> nil

また、シンボルとハッシュロケットの組み合わせを、下記のようにキーの名前の後にコロンを置く記法も同じように使える。

{ name: "Michael Hartl", email: "michael@example.com" }

CSSを追加する

ハッシュを学んだので、下記が理解できるようになっている。

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

まずは、丸カッコがないが、Rubyでは丸カッコは使用しなくてもいいので、下記の2つの行は等価となる。

stylesheet_link_tag('application', media: 'all',
                    'data-turbolinks-track': 'reload')
stylesheet_link_tag 'application', media: 'all',
                    'data-turbolinks-track': 'reload'

次にmedia引数はハッシュだが、波カッコがない点が不思議。
ハッシュはメソッド呼び出しの最後の引数である場合は、波カッコを省略できるためであり、下記の2つの行は等価となる。

stylesheet_link_tag 'application', { media: 'all',
                    'data-turbolinks-track': 'reload' }
stylesheet_link_tag 'application', media: 'all',
                    'data-turbolinks-track': 'reload'

Rubyでは改行と空白を区別していないため、上記のように途中に改行が含まれていても問題ない。

以上の事から、stylesheet_link_tagメソッドは、2つの引数で呼ばれており、最初の引数はである文字列は、スタイルシートへのパスを示す。
次の引数であるハッシュには2つの要素があり、最初の要素はメディアタイプを示し、次の要素はturbolinksという機能をオンにしている。
最後に上記を読み込んで生成されたHTMLソースは下記となる。

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

クラス

クラスの継承

String ⇨ Object ⇨ BasicObject ⇨ nil(スーパークラスを持たないという事)
Array、Hashなどのクラスも上記と同様である。これが"Rubyではあらゆる物がオブジェクトである"という事。

>> s = String.new("foobar")
=> "foobar"
>> s.class
=> String
>> s.class.superclass
=> Object
>> s.class.superclass.superclass
=> BasicObject
>> s.class.s

クラス継承の例

>> class Word < String             # WordクラスはStringクラスを継承する
>>   # 文字列が回文であればtrueを返す
>>   def palindrome?
>>     self == self.reverse        # selfは文字列自身を表します
>>   end
>> end
=> :palindrome?

上記の様に、WordクラスはStringクラスを継承しているため、palindrome?メソッドだけでなく、Stringクラスが扱える全てのメソッドがWordクラスでも扱える様になる。

>> s = Word.new("level")    # 新しいWordを作成し、"level" で初期化する
=> "level"
>> s.palindrome?            # Wordが回文かどうかを調べるメソッド
=> true
>> s.length                 # WordはStringで扱える全てのメソッドを継承している
=> 5

selfキーワード

selfとは、オブジェクトそのものを指している。

attr_accesssorメソッド

クラスにインスタンス変数を読み書きするためのアクセサメソッドを定義するメソッド。
アクセサメソッドは、外部インスタンスのインスタンス変数を参照したり変更するために定義する。

initialize

User.newを実行すると自動的に呼び出されるメソッド。

0
0
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
0
0