新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

Ruby on Railsの学習:環境構築と導入

[Ruby on Rails]環境構築と導入

参考書籍

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

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

1章:イントロダクション

Railsプログラミングに必要なソフトウェア
  • Railsインストール中のエラー
$ sudo gem install rails
Building native extensions.  This could take a while...
ERROR:  Error installing rails:
	ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/include/ruby.h
$ sudo gem install rails
Building native extensions.  This could take a while...
ERROR:  Error installing rails:
	ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
creating Makefile

make "DESTDIR="
compiling generator.c
linking shared-object json/ext/generator.bundle
clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
make: *** [generator.bundle] Error 1
$ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future gem install rails 
Building native extensions.  This could take a while...
(以下略)

2章:Ruby on Railsの基本

新規アプリケーションの作成
  • railsコマンドを使用
    • railbookという名前のアプリケーションを作成するには以下
    • (エラー回避が必要なのはRubyのversionが原因っぽい?)
sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future rails new railbook
  • HTTPサーバ(WEBrick)の起動
    • アプリケーションルート(railbook/直下)で実行
    • rails server

f:id:uriku:20140621123934p:plain

コントローラ
  • rails generate controller name [options]
    • /railbook/app
      • /assets:CoffeeScriptとSCSS
      • /controllers:コントローラクラス本体
      • /views:テンプレートの保存フォルダ
      • /helpers:ビューヘルパ
    • /railbook/test
$ rails generate controller hello
      create  app/controllers/hello_controller.rb
      invoke  erb
      create    app/views/hello
      invoke  test_unit
      create    test/controllers/hello_controller_test.rb
      invoke  helper
      create    app/helpers/hello_helper.rb
      invoke    test_unit
      create      test/helpers/hello_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/hello.js.coffee
      invoke    scss
      create      app/assets/stylesheets/hello.css.scss
  • hello_controller.rb
class HelloController < ApplicationController
  def index
    render text: 'hello, world!'
  end
end
    • 2~4行目以外は自動生成
    • コントローラクラスはApplicationControllerクラスを継承している必要
    • 具体的な処理を実装するのはアクションメソッド
      • 上の例だとindexメソッド
      • アクションメソッドである条件はpublicであることだけ
      • render text: valueでvalueを出力
      • ただし、MVCモデルを考えるとControllerから直接出力を生成するのは不適切(デバッグなどに使うだけと理解しておく)
  • /config/routes.rb
    • ルーティング設定(ルート)を定義
  match	':controller(/:action(/:id))', via: [ :get, :post, :patch ]
  • コントローラの命名規則
    • コントローラ名をhelloにした場合
    • コントローラクラス:HelloController
    • コントローラクラスのファイル名:hello_controller.rb
    • ヘルパーファイル名:hello_helper.rb
    • テストスクリプト名:hello_controller_test.rb
ビュー
  • ERB(Embedded Ruby)テンプレートを利用
    • テンプレート変数の設定
class HelloController < ApplicationController 
  def view
    @msg = 'こんにちは、世界!'
  end
end
    • テンプレートファイルの作成
      • /app/view/hello(controller)/view(action).html.erb
<div id="main">
<%= @msg %>
</div>
      • localhost:3000/hello/view/でアクセス可能
  • 動的な処理は<% ... %>や<%= ... %>で記述する
    • <% 任意のコード %>
    • <%= なんらかの値を返す式(変数) %>
    • <%# コメント %>
    • #:<% ... %>ブロックで用い、行末までがコメント
    • <% =begin %> コメント <% =end %> (beginとendは行頭に書く)
    • htmlのコメント
モデル
  • モデルクラスの作成
    • rails generate model name field:type [...] [options]
    • ex) booksテーブル(isbn, title, price, publish, published, cd)の作成
$ rails generate model book isbn:string title:string price:integer publish:string published:date cd:boolean
      invoke  active_record
      create    db/migrate/20140621115931_create_books.rb
      create    app/models/book.rb
      invoke    test_unit
      create      test/models/book_test.rb
      create      test/fixtures/books.yml
Riku-MBA:railbook riku$ rake db:migrate
== 20140621120332 CreateBooks: migrating ======================================
-- create_table(:books)
   -> 0.0041s
== 20140621120332 CreateBooks: migrated (0.0042s) =============================
  • フィクスチャによるテストデータの準備
    • フィクスチャ:テストデータをDBに流し込む仕組み
    • test/fixtures以下にbooks.ymlを入れる

# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html

modernjava:
  id: 1
  isbn: 978-4-7741-5878-5
  title: AndroidエンジニアのためのモダンJava
  price: 3360
  publish: 技術評論社
  published: 2013-08-20
  cd: false
...
    • rake db:fixtures:load FIXTURES=booksで読み込み
  • DBからデータの取得と表示
    • listアクションの追加
    • Book.allはBookモデルクラスのallメソッドを呼び出している(SELECT * FROM booksのような命令を発行)
class HelloController < ApplicationController
...
  def list
    @books = Book.all
  end
end
    • テンプレートファイルの作成
    • /app/view/list.html.erb
<table border="1">
  <tr>
    <th>ISBNコード</th>
    <th>書名</th>
    <th>価格</th>
    <th>出版社</th>
    <th>刊行日</th>
    <th>CD-ROM</th>
  </tr>

<% @books.each do |book| %>
  <tr>
    <td><%= book.isbn %></td>
    <td><%= book.title %></td>
    <td><%= book.price %></td>
    <td><%= book.publish %></td>
    <td><%= book.published %></td>
    <td><%= book.cd %></td>
  </tr>
<% end %>
</table>

f:id:uriku:20140621211916p:plain