社会不適合破壊的お味噌マン

くまのプーさんのような大人になりたいです!

RoRチュートリアルメモ(第3章)

Railsアプリケーション作成の際

rails new sample_app --skip-test-unit

railsの--skip-test-unitというオプションはTest::Unitフレームワークと関連しているtestディレクトリを作成しないようにするオプションでRspecを使う場合使用する。

Rails Gemfileについて

#開発環境
group :development do
  gem 'sqlite3', '1.3.8' 
  gem 'rspec-rails', '2.13.1'
end

#テスト環境
group :test do
  gem 'selenium-webdriver', '2.35.1' 
  gem 'capybara', '2.1.0'
end

#本番環境
group :production do
  gem 'pg', '0.15.1' 
  gem 'rails_12factor', '0.0.2'
end

#セットで書くこともできる
group <u>:development, :test </u>do
  gem 'sqlite3', '1.3.8' 
  gem 'rspec-rails', '2.13.1'
end

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

Bundle Install

Bundle Installの手順

$ bundle install --without production 
$ bundle update 
$ bundle install

--without productionオプションを追加することで、本番環境のgemのみをインストールしないようにすることができる。 このオプションは “remembered option” と呼ばれるもので、このオプションを一度実行するとコマンドに保存され、今後Bundlerを実行するときにオプションを追加する必要がなくなります。このため、今後は単にbundle installを実行するだけで、自動的に本番環境用gemをスキップできるようになります2。

Gemfile.lockについて

「Gemfile.lock」はインストールされたGemパッケージの名前とバージョンが記録されたものです。

他の環境で同じアプリケーションの開発を行なう場合は、プログラムファイルに加えてこの「Gemfile.lock」ファイルを配布します。

そして他の環境で「bundle install」を実行すると、今度は「Gemfile.lock」ファイルが参照され、指定されたバージョンのGemパッケージがインストールされます。

Gemfile.lockがない場合(通常は開発最初期)

Gemfile.lockが作成され、Gemfileに従ってgemがインストールされる。そのときに実際にインストールされたgemとその依存関係がGemfile.lockに保存される。

Gemfileにgemが追加された場合(通常は開発時)

Gemfileに追加されたgemとそれに依存する未インストールgemのみがインストールされ、Gemfile.lockはそれらのgemについてのみ更新される。

Gemfileに変更がない場合(通常はデプロイ時)

Gemfile.lockに従ってインストールされる。Gemfileは参照されず、Gemfile.lockは更新されない。

bundle installとupdateの使い方について - saj_kzの日記

補足: bundle updateについて

ここで注意すべきはbundle updateです。

bundle updateを実行すると現状のGemfile.lockの内容は無視され、 上で言う「Gemfile.lockがない場合」と同じことが行われます。 当然ながら、Gemfile.lockは、現時点の最新バージョンと依存関係を持つgemによってごっそり更新されてしまいます。

かく言う私も、当初はbundle installとbundle updateの違いに気付かないままカジュアルにbundle updateを実行してしまってました。

gemの紹介記事などでbundle updateを指示していることが時たまあり、 それに釣られてしまっていたようです。 恐ろしいことです。

アプリ開発の初期段階では、bundle installとbundle updateのどちらを実行していても矛盾は顕在化しません。

しかし、しばらく更新が行われていない間にgemのバージョンが進んでしまうと、 bundle updateを実行したときにgemとGemfile.lockが一斉更新されてしまい、 以前動作したgemが動作しなくなるようなことがあります。

開発初期のローカルアプリならともかく、 実際に動いているシステムのメンテ中にうかつにbundle updateを実行すると死を招きます。

そしてGemfile.lockがリポジトリに登録されておらず、 前回デプロイ時のバックアップもなければ、動いていた状態を再現できなくなって詰んで終わります。

Gemfile.lockはリポジトリに登録しましょう。 そしてbundle updateは基本的に実行せず、 特定のgemのみを最新にする目的でbundle update gem名のようにgem名を指定して実行するぐらいにとどめましょう。

なお、Gemfile.lockがあるとデプロイがうまくいかないのは、 開発・本番環境間の不整合が原因である可能性が高いので、 Gemfile.lockを除外するのではなく不整合を解決する必要があります。

セキュリティ面について

必ず.gitignoreは設定する。

# Ignore bundler config.
/.bundle

# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal

# Ignore all logfiles and tempfiles.
/log/*.log
/tmp

# Ignore other unneeded files.
doc/
*.swp
*~
.project
.DS_Store
.idea
.secret

Rsepcのインストール

rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb

Railsの基礎操作

モデル、コントローラー、ビューの作成

$ rails generate controller
$ rails destroy controller

コントローラーを生成すると自動でconfig/routes.rbファイルが自動的に更新されます。この routesファイルに記述されている内容 (ルーティング) に従って、 複数のURLとWebページを対応付けます。

configディレクトリという名前のとおり、このディレクトリ内にあるファイルは、Railsがアプリケーションの設定を読み込む時に必要になります。

マイグレート処理

#データベースのマイグレーションを変更できる
$ rake db:migrate

#1つ前の状態に戻る
$ rake db:rollback

#最初の状態に戻す
$ rake db:migrate VERSION=0
#versionを変えることで