『Ruby on Rails 5 アプリケーションプログラミング』を学習する4

Ruby on Rails 5アプリケーションプログラミング

Ruby on Rails 5アプリケーションプログラミング

序文

Ruby on Rails 5 アプリケーションプログラミング」学習4日目。
私事ですが昨日は□□□(クチロロ)という変なバンドのLiveに行ってきました。楽しかったです。

GitHub

github.com

客観的成果

  • 第2章
    • 2.5 Railsの設定情報
  • 第3章
    • 3.1 Scaffolding機能によるアプリ開発
    • 3.2 一覧画面の作成(index アクション)

(学習時間:4時間)

コード実装部分

↓/railbook/config/my_config.yml

# アプリ固有の設定情報はconfigフォルダ下に
# 自分で.ymlファイルを作る
# YAML.load(File.read("#{Rails.root}/config/my_config.yml"))[Rails.env]
# みたいな書き方で呼び出す
COMMON: &COMMON
  author: 'Yuji Koyama'
  hatena_blog:
    title: 'カロリーメイトください'
    url: 'http://yjkym.hatenablog.com/'

development:
  <<: *COMMON

test:
  <<: *COMMON

production:
  <<: *COMMON

↓/config/initializers/my_config.rb

# 設定ファイルを読み込む
# YAML.loadで読み込んだymlファイルの情報から
# 現在の開発環境に設定しているものを読み込み、
# グローバル変数に代入している
MY_APP = YAML.load(File.read("#{Rails.root}/config/my_config.yml"))[Rails.env]

↓/app/controllers/yahoo_controller.rb

# コントローラークラスはすべてApplicationControllerクラスを継承する
class YahooController < ApplicationController
 
 # 省略

  def hatena
    # config\initializers\my_config.rb
    # でアプリ固有の設定情報をMY_APPに読み込んでいる
    render plain: MY_APP['hatena_blog']['title'] + '' + MY_APP['hatena_blog']['url']
  end
end

↓/config/routes.rb

# ルーティング設定を指定する
Rails.application.routes.draw do
  # resoucesメソッドで以下のようなルーティングが設定される
  # :formatが省略された場合はhtmlとみなされる
  # GET    /cds(.:format)          cds#index
  # POST   /cds(.:format)          cds#create
  # GET    /cds/new(.:format)      cds#new
  # GET    /cds/:id/edit(.:format) cds#edit
  # GET    /cds/:id(.:format)      cds#show
  # PATCH  /cds/:id(.:format)      cds#update
  # PUT    /cds/:id(.:format)      cds#update
  # DELETE /cds/:id(.:format)      cds#destroy
  resources :cds
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

  # 'yahoo/index' というURLが要求(GET)されたら
  # 'yahoo'コントローラーの'index'アクションを呼び出す
  # 'hoge/page'など無関係なURLを割り当てることも可
  get 'yahoo/index', to: 'yahoo#index'

  # to: を省略した書き方
  get 'yahoo/view'
  # get 'yahoo/view', to: 'yahoo#view'と同等

  get 'yahoo/list'
  get 'yahoo/hatena'
end

↓/app/views/cds/index.html.erb

<%# .html.erb はERB(embedded Ruby)を用いて %>
<%# HTML形式の出力を生成するテンプレートという意味 %>
<p id="notice"><%= notice %></p>

<h1>Cds</h1>

<table>
  <thead>
    <tr>
      <th>Jan</th>
      <th>Title</th>
      <th>Price</th>
      <th>Artist</th>
      <th>Released</th>
      <th>Is major</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @cds.each do |cd| %>
      <tr>
        <td><%= cd.jan %></td>
        <td><%= cd.title %></td>
        <td><%= cd.price %></td>
        <td><%= cd.artist %></td>
        <td><%= cd.released %></td>
        <td><%= cd.is_major %></td>

        <%# link_toメソッド(ビューヘルパー)の単純な使い方 %>
        <%# Rubyではメソッド呼び出しの括弧を省略できることに注意 %>
        <%# <%=link_to 'カロリーメイトください', 'http://yjkym.hatenablog.com/', class: 'hoge', title:'page' %_>(アンダーバー不要) %>
        <%# ↓出力されるHTML %>
        <%# <a class="hoge" title="page" href="http://yjkym.hatenablog.com/">カロリーメイトください</a> %>

        <%# link_toメソッドの第二引数にオブジェクトが渡されると %>
        <%# 引数のオブジェクトはキー値を表し %>
        <%# 現在のパスにオブジェクトのキー値を加えた %>
        <%# パスが生成される %>
        <%# ↓出力されるHTML %>
        <%# <a href="/cds/51848956">Show</a> %>
        <td><%= link_to 'Show', cd %></td>

        <%# edit_cd_pathもビューヘルパーで %>
        <%# 引数にidを渡すことで %>
        <%# /cds/:id/editというパスを返す %>
        <%# 引数のcdはやはりオブジェクトのキー値を表している %>
        <%# ↓出力されるHTML %>
        <%# <a href="/cds/51848956/edit">Edit</a> %>
        <td><%= link_to 'Edit', edit_cd_path(cd) %></td>

        <%# link_toメソッドにdata-confirmオプションを指定すると %>
        <%# クリック時に確認ダイアログを表示する %>
        <%# またmethodオプションを指定することで %>
        <%# GET以外のHTTPメソッドを利用できる %>
        <%# ただし内部的には(一般的なブラウザに対応するため) %>
        <%# POSTメソッドで通信が行われている %>
        <%# 前置のコロン(:delete)はRubyのシンボルを表し、 %>
        <%# 「データとして利用されない文字列」を表す? %>
        <%# 「列挙されてない列挙体」というイメージでいる %>
        <%# ↓出力されるHTML %>
        <%# <a data-confirm="Are you sure?" rel="nofollow" data-method="delete" href="/cds/980190962">Destroy</a> %>
        <%# no-follow属性はどのタイミングでついたのかな %>
        <%# method: :deleteを指定したタイミングだろうか %>
        <td><%= link_to 'Destroy', cd, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%# new_cd_pathもビューヘルパーで %>
<%# /cds/newというパスを返す %>
<%# ↓出力されるHTML %>
<%# <a href="/cds/new">New Cd</a> %>
<%= link_to 'New Cd', new_cd_path %>

実行結果

f:id:yjkym:20180327165221p:plain f:id:yjkym:20180327165600p:plain

感想

今日はアプリ固有の設定情報の設定方法と、scaffoldコマンドの使い方、scaffoldで生成されたindex関連のファイルの読み方について。
一応、通った道ではあるけど、理解できていないことも多くておもしろかった。
Rubyで前置のコロンがシンボルを設定しているということを初めて理解した。
記号関連の意味って調べにくいんだよねぇ。
カロリーメイトください。

おまけ1(モデル関連の命名規則

種類 概要
モデルクラス アッパーキャメルケース Cd
モデルクラスのファイル名 スネークケース・単数 cd.rb
テーブル名 スネークケース・複数 cds
テストスクリプト スネークケース+'_test' cd_test.rb

おまけ2(resourcesメソッドで生成されるルーティング情報)

URLパターン HTTPメソッド 呼び出すアクション
/cds(.:format) GET index /cds.html
/cds/:id(.:format) GET show /cds/123456.html
/cds/new(.:format) GET new /cds/new.html
/cds(.:format) POST create /cds.html
/cds/:id/edit(.:format) POST edit /cds/123456/edit.html
/cds/:id(.:format) PATCH or PUT update /cds/123456.html
/cds/:id(.:format) DELETE destroy /cds/123456.html

':id'はURLからidパラメータとして与えられた値、
'.:format'は.(ドット)+URLの拡張子を表す。省略可。

BGM

絶対零度 / 集団行動 www.youtube.com