Railsチュートリアルの学習記録③ ~4章 Ruby~

はじめに

Railsチュートリアルの学習記録です。

※前回の記録

Railsチュートリアルの学習記録② ~3章 テスト~

Railsチュートリアルの学習記録 ~1章・2章 scaffold活用~

第4章 Rails風味のRuby

リンク

まずはブランチを切り替え

git checkout -b rails-flavored-ruby

①ヘルパー

ヘルパーとは、ある動作を処理する場合にメソッド化して扱えるようにRailsにあらかじめ組み込まれた機能のこと。

application.html.erbの確認

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

stylesheet_link_tagRailsの組み込み関数ではapplication.cssをすべてのメディアタイプで使えるようにしている。

ここには少なくとも混乱を生じる可能性のあるRubyの概念が4つあります。Railsの組み込み関数、カッコを使わないメソッド呼び出し、シンボル、そしてハッシュです。

カスタムヘルパーの作成

app/helpers/application_helper.rbを編集

module ApplicationHelper
  def full_title(page_title = '')
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      page_title + " | " + base_title
    end
  end
end

application.html.erbの編集

×   <title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
○   <title><%= full_title(yield(:title)) %></title>

②クラス継承

※4.4.2の内容

> rails c
Loading development environment (Rails 5.1.7)
irb(main):001:0> s = String.new("Test")
=> "Test"
irb(main):002:0> s.length
=> 4
irb(main):003:0> s.class
=> String
irb(main):004:0> s.class.superclass
=> Object
irb(main):005:0> s.class.superclass.superclass
=> BasicObject
irb(main):006:0> s.class.superclass.superclass.superclass
=> nil

irb(main):007:0> n = Integer(1)
=> 1
irb(main):008:0> n.class
=> Integer
irb(main):009:0> n.class.superclass
=> Numeric
irb(main):010:0> n.class.superclass.superclass
=> Object
irb(main):011:0> n.class.superclass.superclass.superclass
=> BasicObject
irb(main):012:0> n.class.superclass.superclass.superclass.superclass
=> nil

🙄superclassメソッドを使うとすべてのクラスがObject(BasicObjectクラスを継承している)であることがわかります!

StaticPagesControllerもクラスであることを確認する。

> c = StaticPagesController.new
=> #<StaticPagesController:0x0000000008192c58 @_action_has_layout=true, @_routes=nil, @_request=nil, @_response=nil>
irb(main):014:0> c.class
=> StaticPagesController
irb(main):015:0> c.class.superclass
=> ApplicationController
irb(main):016:0> c.class.superclass.superclass
=> ActionController::Base
irb(main):017:0> c.class.superclass.superclass.superclass
=> ActionController::Metal
irb(main):018:0> c.class.superclass.superclass.superclass.superclass
=> AbstractController::Base
irb(main):019:0> c.class.superclass.superclass.superclass.superclass.superclass
=> Object
irb(main):020:0> c.class.superclass.superclass.superclass.superclass.superclass.superclass
=> BasicObject
irb(main):021:0> c.class.superclass.superclass.superclass.superclass.superclass.superclass.superclass
=> nil
irb(main):022:0> c.home # アクションを呼ぶことも可能
=> nil

🙄これはだいぶ面白いですね!!

※アクションを呼ぶとnilと返ってくることに関して。

実は、Railsは確かにRubyで書かれていますが、既にRubyとは別物なのです。Railsのクラスは、普通のRubyオブジェクトと同様に振る舞うものもありますが、多くのクラスにはRailsの魔法の粉が振りかけられています。Railsは独特であり、Rubyとは切り離して学習する必要があります。

③ユーザークラス作成

example_user.rbの作成

class User
  attr_accessor :name, :email

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

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

attr_accessorで属性に対応するアクセサーを作成。
これにより、そのデータを取り出すメソッド(getter)と、データに代入するメソッド(setter)を定義してくれる。

→コントローラ内で宣言するだけでビューからアクセスできるインスタンス変数ができる。

コンソールで確認※再起動必要

> rails c
Loading development environment (Rails 5.1.7)
irb(main):001:0> require './example_user'
=> true
irb(main):002:0> u = User.new
=> #<User:0x0000000008102b80 @name=nil, @email=nil>
irb(main):003:0> u.name
=> nil
irb(main):004:0> u.name = "sato"
=> "sato"
irb(main):005:0> u.email = "sato@example.com"
=> "sato@example.com"
irb(main):006:0> u.formatted_email
=> "sato<sato@example.com>"

削除

rm example_user.rb

プッシュ

$ git commit -am "Add a full_title helper"
$ git checkout master
$ git merge rails-flavored-ruby
$ rails test
$ git push
$ git push heroku // 未実施

✅その他参考になった点

・後続if:trueのときのみ実行される式

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

・Rubyではシンボルを多用する

おわりに

rails consoleの活用方法を深く学べたので良かった。

ここでいったんProgateなりでRubyについて復習してもよいかもしれない。

さくっとみてみたけど5章ではどうやらBootstrap、Sassなどライブラリを活用してフロント寄りの実装をしていくっぽいですね。

備忘録

6章~8章でログイン機能

9章でremember_me

10章でユーザーのCRUD

11章で送信メール

12章でパスワードの設定

13章で画像表示など

14章でフォロー機能

コメントを残す