Rails – 色々やってみる

$ rails new rails1
$ cd rails1
$ rails db:migrate

プロジェクト作っていきなりdb:migrateしたら、developement.sqlite3と、schema.rbが作成された。中身はからなはず。DataGrip使って見てみる。空だ。
とりあえず1つscaffoldする。

$ rails g scaffold user name:string email:string
      invoke  active_record
      create    db/migrate/20170411151003_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

大量のものを作成している。
この状態で、rails sをすると下記エラーがでる。

Migrations are pending. To resolve this issue, run: bin/rails db:migrate RAILS_ENV=development

マイグレーションをDBに反映してないことが分かるようです。
マイグレーションファイルを見てみます。

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

ではSQLiteを見てみます。DataGrip便利だな。usersテーブルができていて、created_at、updated_atもあります。idというプライマリーキーもあります。
scaffoldするとjsonにも対応している。

とりあえずViewにBootstrapを適用してみる。その前に、cssとかの読み込み状態を確認してみる。

<link rel="stylesheet" media="all" href="/assets/scaffolds.self-50415e02e26bd1d252d84df1b2baeea859ec7e1c4f26c45a801029454454bc62.css?body=1" data-turbolinks-track="reload" />
<link rel="stylesheet" media="all" href="/assets/users.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" />
<link rel="stylesheet" media="all" href="/assets/application.self-af04b226fd7202dfc532ce7aedb95a0128277937e90d3b3a3d35e1cce9e16886.css?body=1" data-turbolinks-track="reload" />
    <script src="/assets/jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/jquery_ujs.self-784a997f6726036b1993eb2217c9cb558e1cbb801c6da88105588c56f13b466a.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/turbolinks.self-c5acd7a204f5f25ce7a1d8a0e4d92e28d34c9e2df2c7371cd7af88e147e4ad82.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/action_cable.self-5454023407ffec0d29137c7110917e1e745525ae9afbc05f52104c4cd6597429.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/cable.self-6e0514260c1aa76eaf252412ce74e63f68819fd19bf740595f592c5ba4c36537.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/users.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script>
<script src="/assets/application.self-b89234cf2659d7fedea75bca0b8d231ad7dfc2f3f57fcbaf5f44ed9dc384137b.js?body=1" data-turbolinks-track="reload"></script>

なんか激しい感じだ。cakephpと違ってAssetまで融合させようとしている感じがひしひしと伝わってくる。
app/assets/javascrptsとapp/assets/styleshetsの中にあるものが全部読み込まれている。

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

この設定を変えると変わるはず。Jsはjquery,jquery-uiとかも勝手にインストールされている。外す方法確認しないと。

下記のようにやると、assetが結合・圧縮されるらしい。処理内容は設定によるだろうけど。

$ rails assets:precompile RAILS_ENV=production

app/assets/javascripts/application.jsと、app/assets/stylesheets/application.cssには、下記のような記述がありここを変更すると読み込む内容を変更できるらしい。

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

assetが便利だけど複雑だな。rails sをやり直さないとエラーのままになることあるな。

$ rails assets:precompile RAILS_ENV=production

をやったら、確かにpublic/assetsに圧縮されたものが格納された。
js/css共に1つのファイルが出力された。あとはgzファイルもある。このコンパイルをしておけば、本場環境ではこれらを読み込むようになるはず。

Railsのコード短いなー。scaffoldだとバリデーションないので、モデルのバリデーション入れてみる。

class User < ApplicationRecord
  before_save { self.email = email.downcase }
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
            format: { with: VALID_EMAIL_REGEX },
            uniqueness: { case_sensitive: false }
end

入力画面で空状態で登録押すとエラーでる。cakephpみたいにformにまでvalidationが反映されるわけではないのかな。
英語のエラーだから日本語にしてみる。Djangoみたいに、設定ファイルで日本語ってやると日本語になるわけではないらしい。
やり方ここに書いてあった。

ja.ymlをconfig/locales/に追加
config/application.rbにconfig.i18n.default_locale = :jaを追加
サーバーを再起動
さらにモデルの属性名(nameなど)を日本語化する場合は、ja.ymlに次のように記載して下さい。

# config/locales/ja.yml
ja:
attributes:
name: 名前

3 error prohibited this user from being saved:というバリデーションエラーのメッセージは英語のままだな。

new.html.erbがすごい。3行しかない。でもrenderだからパーシャルを読み込んでるわけで、全自動でフォームが作られてるわけではない。

<h1>New User</h1>

<%= render 'form', user: @user %>

<%= link_to 'Back', users_path %>

パーシャルは、下記のように書く。これは_form.html.erbを読み込む。アンダーバーがパーシャルのしるしらしい。

<%= render 'form'%>

パーシャルの内容は下記。

<%= form_for(user) do |f| %>
  <% if user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% user.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>

  <div class="field">
    <%= f.label :email %>
    <%= f.text_field :email %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

エラーメッセージがベタ打ちだから英語のままだったんだな。

エラーメッセージの表示方法はアプリケーションごとに異なるため、Railsではこれらのメッセージを直接生成するビューヘルパーは含まれていません。 しかし、Railsでは一般的なバリデーションメソッドが多数提供されているので、カスタムのメソッドを作成するのは比較的簡単です。また、scaffoldを使用して生成を行なうと、そのモデルのエラーメッセージをすべて表示するERBがRailsによって一部の_form.html.erbファイルに追加されます

bootstrapに対応して、エラーを日本語にしてみた。

<div class="row">
<%= form_for(user) do |f| %>
  <% if user.errors.any? %>
    <div id="error_explanation">
      <h2><%= user.errors.count %>件のエラーが発生しました</h2>
      <ul>
      <% user.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <div class="col-md-6">
    <%= form_for(@user, url: users_path) do |f| %>
        <div class="form-group">
          <%= f.label :name %>
          <%= f.text_field :name, class: 'form-control' %>
        </div>
        <div class="form-group">
          <%= f.label :email %>
          <%= f.email_field :email, class: 'form-control' %>
        </div>
        <%= f.submit "submit", class: "btn btn-primary" %>
    <% end %>
  </div>
<% end %>
</div>

エラー発生フィールドはエラークラスのdivで囲われるから、それにスタイルつければ、エラーここだよ、というのが示せる。

次は、モデル(アクティブレコードと呼ぶらしい)のクエリ系のやつ覚えて、セッション、キャッシュとか確認して、認証のやり方確認して、セキュリティに関して確認したら大体何でもできそう。

Rubyのempty, false, nilなど

empty, false, nilとrailsにはblankもあるらしいけど、これしっかり覚える。

nil? empty? blank? present? の使い分け

nil? すべてのオブジェクトに定義されている。nilのときのみtrueを返す。
empty? 文字列の長さが0のとき、または配列が空のときにTrueを返す。もちろん数値には定義されていない。
blank? railsの拡張。nil, “”, ” “, [], {} のいずれかでTrueを返す。
present?は、!blank?と同じ意味

結果

・0 false nilは別物
・nil?は、nilのときtrue。
(未定義の変数に使うとエラーになる。存在する配列の中の、存在しない要素だとエラーにならず、trueを返す)
・empty?は、文字列、配列に使えて、空文字列か配列が空のときtrue
・blank?は、nil, false, 空文字列, スペースだけの文字列, 配列が空のときtrue
 (未定義の変数に使うとエラーになる。存在する配列の中の、存在しない要素だとエラーにならず、trueを返す)
・present?は、!blank?
PHPよりわかり易いと思った。
・変数が定義済みかを確認するには、defined?を使える。

irbでやってみる。

a = 1
a.nil?
false
a.empty?
ERROR
a.blank?
ERROR
a.present?
ERROR

b = ''
b.nil?
false
b.empty?
true
b.blank?
ERROR
b.present?
ERROR

c = false
c.nil?
false
c.empty?
ERROR

d = 0
d.nil?
false
d.empty?
ERROR

z.nil?
ERROR

定義してない変数にnil使ってもエラー。falseでも0でも定義さえしてたら、nilじゃない。

c == 0
false

falseは0でもnilでもない。

f = []
f.length
0
f.empty?
true
f.nil?
false

emptyは文字列、配列に使える。数値には使えない。

rails consoleでやってみる。

$ rails c
a = 1
a.empty?
ERROR
a.blank?
false
a.present?
true

b = 0
b.empty?
ERROR
b.blank?
false
b.present?
true

c = ''
c.empty?
true
c.blank?
true
c.present?
false

d = false
d.empty?
ERROR
d.blank?
true
d.present?
false

falseの場合もblank?はtrueを返す。

e = {}
e.empty?
true
e.blank?
true
e.present?
false

f(未定義)
ERROR
f.empty?
ERROR
f.blank?
ERROR
f.present?
ERROR

あら未定義だとblankもpresentもエラーになる。
railsのコントローラ上で試してみてもエラーになった。
定義済みじゃないとエラーになるのか。色々PHPと違う。

a = false
logger.debug 'a is blank' if a.blank?
# logger.debug a if b.blank?
c = {'a': 12, 'b':13}
logger.debug 'c[:a] is present' if c[:a].present?
logger.debug 'c[:c] is blank' if c[:c].blank?
d = '    '
e = '   '
logger.debug 'd is blank' if d.blank?
logger.debug 'e is blank' if e.blank?
logger.debug 'c[:c] is nil' if c[:c].nil?

上記をコントローラでやると、development.logに下記が表示される。

a is blank
c[:a] is present
c[:c] is blank
d is blank
e is blank
c[:c] is nil

配列の要素に対しては、blankを使ってもエラーにならないらしい。

また、rails consoleでやってみる。

c = {}
c['a'].blank?
true
c['a'].empty?
ERROR
c[:a].nil?
true

あとは一応クラスつくって試してみる。

class Hoge
  attr_accessor :name
end
a = Hoge.new
a.name
nil
a.name.nil?
true
a.name.empty?
ERROR
Hoge.nil?
false
Hoge.blank?
false
Hoge.present?
true
a.nil?
false
a.blank?
false
a.present?
true

変数が存在するか確認するには、definedが使えるらしい。

rails consoleで試してみる

a = false
b = ''
c = []
d = new Hoge

defined? a
=> "local-variable"
defined? b
=> "local-variable"
defined? c
=> "local-variable"
defined? d
=> "local-variable"
defined? c[:a]
=> "method"
defined? d.name
=> "method"
defined? d.hoge
=> nil
defined? z
=> nil

未定義の変数に使ったらnilが返ってくる。存在する配列の存在しない要素に使うと、methodって返ってくる。存在するオブジェクトの値がnilのメンバ変数に使うと、methodって返ってくる。

Railsのデバッグ方法

ログ出力

logger.debug "出力したいデバッグ情報"

オブジェクトをわかり易く表示

@test.inspect
p @test

RubyMineのデバッグ機能を使う
RubyMineでPowを使いながらDebugする方法

byebugというgemを使う
byebugでやるのはめんどうだからRubyMineのがいいや。

RubyMineでデバッグしてみる

Run -> Debug… -> Debug Development: hogeを実行すると、デバッグ用のサーバが立ち上がる。localhost:3000にアクセスすると、ブレークポイントついてるところでとまって情報が表示される。便利。

APIの場合どうなるか?
Debug Development: hogeを実行し、デバッグ用サーバを立ち上げておき、ブレークポイントをつけて、postmanでアクセスしたら、ちゃんと止まった。うれしいっす。すごい楽だな。

Powというのは便利そうだから今度しらべよう。

Railsの使い方(1)

チュートリアルやりながら、使い方まとめます。

railsコマンド

便利なコマンドが沢山ある。rails5になって変わったのも結構あるらしい。API用の軽量なやつをさくっと作れるとかもよさそう。

下記のように省略できる。

$ rails generate -> rails g
$ rails server -> rails s
$ rails console -> rails c
$ rails test -> rails t
$ bundle install -> bundle

元に戻す

rails destroyで大体何でも戻る

$ rails destroy model User
$ rails destroy controller StaticPage

マイグレーションは、rollback

$ rails db:rollback
$ rails db:migrate VERSION=0 #最初の状態に戻る

プロジェクトの作成

$ rails new hoge

Gemfileの編集

欲しいgem書く。groupをつくって環境を分ける。下記でインストールする。

$ bundle install

インストール対象外にしたいグループがある場合、下記のようにする。

$ bundle install --without production

Scaffold作成

rails generate scaffoldで作成できる。モデル名のあとにフィールドを書く。

$ rails generate scaffold User name:string email:string

マイグレーション

$ rails db:migrate

ルーティング

config/routes.rbを編集する。
resources :テーブル名、とするだけで一通りの規定のアクションにアクセスできるようになる。
root ‘controller#action’、とすればルート画面の設定できる。

Rails.application.routes.draw do
  resources :users
  root 'application#hello'
end

Model

下記のような感じで、テーブル同士の関係を書くことで勝手に紐づく。
models/user.rb

class User < ApplicationRecord
  has_many :microposts
end

バリデーションは下記のような感じ。メッセージはどこに書くのかな。
model/micropost.rb

class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length: { maximum: 140 }
end

コントローラ

rails generate controllerで作れる。コントローラ名のあとアクションを書ける。

$ rails generate controller StaticPage home help

テスト

コントローラのテストはこんな感じで書く。

require 'test_helper'

class StaticPageControllerTest < ActionDispatch::IntegrationTest
  test "should get home" do
    get static_page_home_url
    assert_response :success
  end

  test "should get help" do
    get static_page_help_url
    assert_response :success
  end

end

テスト実行

$ rails t

Railsの日本語ドキュメント

Ruby on Rails ガイド (5.0 対応)
電子書籍版もあってうれしい。
Ruby on Rails チュートリアル

チュートリアルからやる。

1-3 最初のアプリケーション

$ mkdir ruby
$ cd ruby
$ rails new hoge
$ cd hoge

フォルダ構成はここに書いてある。

railsサーバを立ち上げる

$ rails server

http://localhost:3000でアクセスできる。

1-4 Hello, world!

rubyは何でもシンプルだな。
アクションは、下記のように書く。

def hello
  render html: "hello, world!"
end

ルーターは、config/routes.rbで、下記のように書く。

root 'application#hello'

コントローラ#アクション

gitで管理する。

$ git init
$ git add -A
$ git commit -m 'first'

Herokuにデプロイしてみる
HerokuはPostgreSQLしか使えないので、Gemfileの本場用にpgを追加する。
まだ、他のgemfileを変更してないので、下記も追加した。

group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen'
  gem 'spring'
  gem 'spring-watcher-listen'
end

group :production do
  gem 'pg'
end

bundle installする

$ bundle install --without production

Heroku CLIをインストールする。

$ heroku version
heroku-cli/5.7.10-3fe323c (windows-amd64) go1.7.5
$ heroku keys:add
$ heroku create
$ git push heroku master

2 Toyアプリケーション

$ git branch toy
$ git checkout toy

Railsのscaffoldは、rails generateスクリプトにscaffoldコマンドを渡すことで生成されます。 scaffoldコマンドの引数には、リソース名を単数形にしたもの (この場合はUser) を使用し、必要に応じてデータモデルの属性をオプションとしてパラメータに追加します

$ rails generate scaffold User name:string email:string

次はDBをマイグレートする。

$ rails db:migrate

何でもシンプルだなー。

@記号で始まる変数をRubyではインスタンス変数と呼び、Railsのコントローラ内で宣言したインスタンス変数はビューでも使えるようになります。

windows10でRuby on Railsを使う

ここからrubyのダウンロードする。Ruby 2.3.3 (x64)にした。インストールした。

$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]

エディタはRubyMine使う。

gemが使えない。

$ gem install rails
Please update your PATH to include build tools or download the DevKit
from ‘http://rubyinstaller.org/downloads’ and follow the instructions
at ‘http://github.com/oneclick/rubyinstaller/wiki/Development-Kit’

http://rubyinstaller.org/downloadsにあったからインストールした。

$ gem -v
2.5.2
$ gem update –system

できた。

$ gem -v
2.6.11

Ruby on Railsをインストール

$ gem install rails
$ rails -v
Rails 5.0.2

Railsのドキュメント見て勉強する。

railsのテスト

controllerを自動作成する

$ rails generate controller StaticPages home help
      create  app/controllers/static_pages_controller.rb
       route  get 'static_pages/help'
       route  get 'static_pages/home'
      invoke  erb
      create    app/views/static_pages
      create    app/views/static_pages/home.html.erb
      create    app/views/static_pages/help.html.erb
      invoke  test_unit
      create    test/controllers/static_pages_controller_test.rb
      invoke  helper
      create    app/helpers/static_pages_helper.rb
      invoke    test_unit
      create      test/helpers/static_pages_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/static_pages.js.coffee
      invoke    scss
      create      app/assets/stylesheets/static_pages.css.scss

上記のファイルが作成される。テスト関連のファイルも作成してくれる。javascriptのファイルまで作成している。

test/controllers/static_pages_controller_test.rbが、static_pages_controllerのテストコード。中身は下記のようになっている。

require 'test_helper'

class StaticPagesControllerTest < ActionController::TestCase
  test "should get home" do
    get :home
    assert_response :success
  end

  test "should get help" do
    get :help
    assert_response :success
  end

end

言葉で表すと「Homeページのテスト。GETリクエストをhomeアクションに対して発行 (=送信) せよ。そうすれば、リクエストに対するレスポンスは[成功]になるはず。」となります。

(引用:http://railstutorial.jp/chapters/static_pages?version=4.2#cha-static_pages

Gemfileの修正

下記チュートリアルの内容。Production環境は、Herokuでpostgreを利用。テストのために、test環境の設定が必要。guardとかは、なくても基本的なことは動くらしい。

引用:http://railstutorial.jp/chapters/static_pages?version=4.2#sec-advanced_testing_setup

source 'https://rubygems.org'

gem 'rails',        '4.2.2'
gem 'sass-rails',   '5.0.2'
gem 'uglifier',     '2.5.3'
gem 'coffee-rails', '4.1.0'
gem 'jquery-rails', '4.0.3'
gem 'turbolinks',   '2.3.0'
gem 'jbuilder',     '2.2.3'
gem 'sdoc',         '0.4.0', group: :doc

group :development, :test do
  gem 'sqlite3',     '1.3.9'
  gem 'byebug',      '3.4.0'
  gem 'web-console', '2.0.0.beta3'
  gem 'spring',      '1.1.3'
end

group :test do
  gem 'minitest-reporters', '1.0.5'
  gem 'mini_backtrace',     '0.1.3'
  gem 'guard-minitest',     '2.3.1'
end

group :production do
  gem 'pg',             '0.17.1'
  gem 'rails_12factor', '0.0.2'
end

Gemfileを修正したら、bundle installする。production環境の設定は開発環境では不要なため、下記のようにする。

$ bundle install --without production

テストの実行

$ bundle exec rake test

テストスイートは期待どおりパス GREEN します (パスしたときにも色を表示できるようにするには、3.7.1のminitestレポーターをオプションで追加する必要があります)。ところで、テストの実行にはある程度時間がかかります。これには2つの要因が絡んでいます: (1) Spring serverを起動してRails環境を事前読み込みするのに時間がかかる。ただしこれは最初の1回だけです。(2) Rubyそのものの起動に時間がかかる (2番目の要因については、3.7.3で紹介するGuardを導入することで改善できます)。

引用:http://railstutorial.jp/chapters/static_pages?version=4.2#sec-advanced_testing_setup

テスト結果に色をつける

ターミナルでテストを実行しても、デフォルトだと文字に色がつきません。test/test_helper.rbの内容を下記のようにすると色がつきます。minitest-reporters gemが必要です。

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
Minitest::Reporters.use!

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

テストの自動実行

Guardというのを使います。’guard-minitest’というgemです。gemのバージョンは、2.3.1です。

guardの初期化

guardを初期化するとGuardfileが作成されます。

$ bundle exec guard init

Guardfileの編集

初期のGuardfileは下記のようになってました。

# A sample Guardfile
# More info at https://github.com/guard/guard#readme

## Uncomment and set this to only include directories you want to watch
# directories %w(app lib config test spec features) \
#  .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}

## Note: if you are using the `directories` clause above and you are not
## watching the project directory ('.'), then you will want to move
## the Guardfile to a watched dir and symlink it back, e.g.
#
#  $ mkdir config
#  $ mv Guardfile config/
#  $ ln -s config/Guardfile .
#
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"

guard :minitest do
  # with Minitest::Unit
  watch(%r{^test/(.*)\/?test_(.*)\.rb$})
  watch(%r{^lib/(.*/)?([^/]+)\.rb$})     { |m| "test/#{m[1]}test_#{m[2]}.rb" }
  watch(%r{^test/test_helper\.rb$})      { 'test' }

  # with Minitest::Spec
  # watch(%r{^spec/(.*)_spec\.rb$})
  # watch(%r{^lib/(.+)\.rb$})         { |m| "spec/#{m[1]}_spec.rb" }
  # watch(%r{^spec/spec_helper\.rb$}) { 'spec' }

  # Rails 4
  # watch(%r{^app/(.+)\.rb$})                               { |m| "test/#{m[1]}_test.rb" }
  # watch(%r{^app/controllers/application_controller\.rb$}) { 'test/controllers' }
  # watch(%r{^app/controllers/(.+)_controller\.rb$})        { |m| "test/integration/#{m[1]}_test.rb" }
  # watch(%r{^app/views/(.+)_mailer/.+})                   { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
  # watch(%r{^lib/(.+)\.rb$})                               { |m| "test/lib/#{m[1]}_test.rb" }
  # watch(%r{^test/.+_test\.rb$})
  # watch(%r{^test/test_helper\.rb$}) { 'test' }

  # Rails < 4
  # watch(%r{^app/controllers/(.*)\.rb$}) { |m| "test/functional/#{m[1]}_test.rb" }
  # watch(%r{^app/helpers/(.*)\.rb$})     { |m| "test/helpers/#{m[1]}_test.rb" }
  # watch(%r{^app/models/(.*)\.rb$})      { |m| "test/unit/#{m[1]}_test.rb" }
end

使っているRailsのバージョンは、4.2.2なので、Rails 4の箇所のコメントを外してみます。変更があったら、該当のテストファイルのテストを実行するようです。

guardの実行

$ bundle exec guard

これで自動実行されるようになりました。

railsのscaffoldを使ってみる

scaffoldの使い方

引用:Toyアプリケーション

Railsのscaffoldは、rails generateスクリプトにscaffoldコマンドを渡すことで生成されます。scaffoldコマンドの引数には、リソース名を単数形にしたもの (この場合はUser) を使用し、必要に応じてデータモデルの属性をオプションとしてパラメータに追加します3。

$ rails generate scaffold User name:string email:string
      invoke  active_record
      create    db/migrate/20160523032732_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

rails generate scaffoldでは、DBまでは更新されないので、マイグレーションが必要らしい。マイグレーションの履歴ファイルはscaffold時点で勝手につくってくれる。db/migrate/20160523032732_create_users.rb。下記のbundle execは不要な環境もあり得る。

$ bundle exec rake db:migrate

cloud9を使っているのですが、DBの設定をした覚えがないのですが、マイグレーションが成功した。sqlite3を使ってるからだった。

Herokuでマイグレーション

Herokuにpush

$ git push heroku

Herokuでマイグレーション

$ heroku run rake db:migrate

cloud9でrailsチュートリアルをしてみる

FireShot Capture 19 - rails_test - Cloud9 - https___ide.c9.io_endo117_rails_test#openfile-README.md

RubyMineというRuby用のPHPStorm的なものもあるらしいです。railsチュートリアルcloud9使ってるし興味あったので、cloud9を使ってみます。

rails server

下記を実行したら、ターミナルの近くに黄色いポップアップが出てきて、URLのリンクが表示された。リンクを開いたら、railsの初期画面が表示された。

$ rails server -b $IP -p $PORT

Gitの設定

エイリアスにco以外に、st、brも追加してみた。cloud9はターミナルもついてるし、便利。ターミナルを別ウインドウで開けないのは残念。あと、ターミナルの入力がもたつく。ネット環境によるとは思うけど。

$ git config --global user.name "Your Name"
$ git config --global user.email your.email@example.com
$ git config --global push.default matching
$ git config --global alias.co checkout
$ git config --global alias.st status
$ git config --global alias.br branch

Bitbucketでリポジトリを作成して、git initしてcommitして、pushしたけどエラーになる。cloud9のターミナルで、下記を実行して、公開鍵をBitbucketのSSH Keyに登録したらできた。

$ cat ~/.ssh/id_rsa.pub

Herokuの設定

Herokuにユーザ登録

https://signup.heroku.com/

herokuコマンド

cloud9はすでにherokuコマンドが使える状態らしい。

$ heroku version
heroku-toolbelt/3.43.0 (x86_64-linux) ruby/2.3.0
heroku-cli/4.30.0-2dfc0f4 (amd64-linux) go1.6.2
=== Installed Plugins
heroku-apps@2.0.3
heroku-cli-addons@0.3.0
heroku-fork@4.1.3
heroku-git@2.5.1
heroku-local@5.0.2
heroku-orgs@1.1.0
heroku-pipelines@1.1.5
heroku-run@3.2.3
heroku-spaces@2.1.2
heroku-status@2.1.4

Herokuにログイン

$ heroku login

下記でSSHキーをHerokuに追加

$ heroku keys:add

Herokuにプロジェクト作成

$ heroku create

Herokuにpush

$ git push heroku master

これで、heroku create時に表示されたURLにアクセスすると、railsが動いている画面が表示される。

MacにRuby on Railsをインストールしてみる

Macのバージョン確認

el capitan 10.11.4です。

MacでRuby on Railsを使えるようにする

参考:
初心者でもできた!Ruby on Rails開発環境の構築方法(Mac編)
rails環境構築(CentOS + ruby on rails)

rubyはインストールされている

$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]

railsをインストール

$ gem update --system
$ gem install --no-ri --no-rdoc rails
$ gem install bundler
$ rails -v
Rails 4.2.6

el capitan 10.11.4なのですが、どうもrbenvで切り替えるのがうまくいかないから、macに直接インストールされているrubyを使うことにした。

railsプロジェクトを作成してみる

rails newで簡単に作成できる。

$ mkdir ~/workspace
$ cd ~/workspace
$ rails new hello

ruby on railsのチュートリアル

http://railstutorial.jp/chapters/beginning?version=4.2

Bundler

Bundlerは、PHPのcomposerみたいなやつだと思う。rails newをすると、bundle installが自動実行される。Gemfileに記載されている内容がインストールされる。

Gemfileの修正

下記のように修正して、bundle installしてみる。

source 'https://rubygems.org'

gem 'rails', '4.2.6'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc

group :development, :test do
  gem 'sqlite3'
  gem 'byebug'
  gem 'web-console', '~> 2.0'
  gem 'spring'
end

rails server

下記で、開発テスト用のローカルWebサーバーを起動できる。http://localhost:3000でアクセスできる。

$ rails server

FireShot Capture 18 - Ruby on Rails_ Welcome aboard - http___local.com_3000_