Railsのコマンドライン

Railsには、必要とされるコマンドラインツールが取り揃えられています。 このガイドを読むことで、次の事が学べるはずです。

  • Railsアプリケーションの作成方法
  • モデル、コントローラー、DBマイグレーション、ユニットテストの生成方法
  • 開発サーバーの起動方法
  • シェル対話を通しての試験
  • 推測とベンチマークを取る方法

このチュートリアルは既に「Rails入門」を読んで、Railsの基本的な知識があることが前提となっています。

1. コマンドラインの基本

Railsを使用するのであれば、必須となる重要なコマンドがあります。 下記は、よく使用されるであろうコマンドを順に並べたものです。

  • rails console
  • rails server
  • rake
  • rails generate
  • rails dbconsole
  • rails new app_name

これらの各コマンドを通して、シンプルなRailsアプリケーションを作成してみましょう。

1.1 rails new

まず始めにすることは、Railsのインストール後にrails newコマンドで新しいRailsアプリケーションを作成することです。

もし、まだRailsがインストールされてなければ、gem install railsでRailsをインストールすることが出来ます。

$ rails new commandsapp
     create
     create  README.rdoc
     create  Rakefile
     create  config.ru
     create  .gitignore
     create  Gemfile
     create  app
     ...
     create  tmp/cache
     ...
        run  bundle install

これだけのコマンドで、Railsはこんなにも沢山のファイルを用意してくれます! これでシンプルなアプリケーションを実行することが出来る、必要なコードを揃えたRailsの環境を手に入れました。

1.2 rails server

rails serverコマンドは、Rubyに付属するWEBrickと呼ばれる小さいWebサーバーを立ちあげます。 Webサーバーを通してアプリケーションの動作を確認したい時に使用します。

WEBrickだけがRailsサーバというわけではありません。これについては、後ほど説明します。

これだけで、Railsサーバーは出来たてのRailsアプリケーションを起動してくれます。

$ cd commandsapp
$ rails server
=> Booting WEBrick
=> Rails 3.2.3 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-05-28 00:39:41] INFO  WEBrick 1.3.1
[2012-05-28 00:39:41] INFO  ruby 1.9.2 (2011-02-18) [x86_64-darwin11.2.0]
[2012-05-28 00:39:41] INFO  WEBrick::HTTPServer#start: pid=69680 port=3000

3つのコマンドを打ちこめば、Railsサーバーがポート3000で受け付けるようになります。 ブラウザでhttp://localhost:3000/を開くと、 Railsアプリケーションを確認することが出来ます。

serverのエイリアスである"s"を使用して、rails sとすることも可能です。

-pオプションを使用すれば、異なるポートを使用することが可能です。 また、development環境は-eで変更することが出来ます。

#production環境をポート4000でサーバを起動
$ rails server -e production -p 4000

-bオプションは、特定のIPアドレスでRailsをバインドします。デフォルトは、0.0.0.0です。 -dオプションを渡すと、サーバーをデーモンとして実行します。

1.3 rails generate

rails generateコマンドは、テンプレートを使用して多様な用途で使用される物を作り出します。 rails generateのみを打ち込むと、利用可能なジェネレーターのリストを表示してくれます。

generateのエイリアスである"g"を使用して、rails gとすることも可能です。

$ rails generate
Usage: rails generate GENERATOR [args] [options]

...
...

Please choose a generator below.

Rails:
  assets
  controller
  generator
  ...
  ...

ジェネレーター用のgemを通して、更にジェネレーターをインストールすることが可能で、 プラグインの一部としてインストールすることも出来ますし、また自分自身で作り出すことも可能です。

ジェネレーターを使用することで、冗長なコードを書いて多大な時間を失うことから逃れる事が出来ます。

それでは、controllerジェネレーターを使用して自分のコントローラーを作成してみましょう。 でも、コマンドはどうやって使えば良いのでしょうか?ジェネレーターに聞いてみましょう。

全てのRailsコンソール・ユーティリティは、helpテキストを持っています。 UNIX系ユーティリティのように、例えば、rails server --helpのようにして、 コマンドの最後に--helpまたは-hを追加して確認してみましょう。

$ rails generate controller
Usage: rails generate controller NAME [action action] [options]

...
...

Description:
    ...

    To create a controller within a module, specify the controller name as a
    path like 'parent_module/controller_name'.

    ...

Example:
    `rails generate controller CreditCard open debit credit close`

    Credit card controller with URLs like /credit_card/debit.
        Controller: app/controllers/credit_card_controller.rb
        Test:       test/controllers/credit_card_controller_test.rb
        Views:      app/views/credit_card/debit.html.erb [...]
        Helper:     app/helpers/credit_card_helper.rb

controllerジェネレーターは、generate controller ControllerName action1 action2のような形式で、 引数を受け入れます。 それでは、挨拶をするhelloアクションを持つGreetingsコントローラーを作成してみましょう。

$ rails generate controller Greetings hello
     create  app/controllers/greetings_controller.rb
      route  get "greetings/hello"
     invoke  erb
     create    app/views/greetings
     create    app/views/greetings/hello.html.erb
     invoke  test_unit
     create    test/controllers/greetings_controller_test.rb
     invoke  helper
     create    app/helpers/greetings_helper.rb
     invoke    test_unit
     create      test/helpers/greetings_helper_test.rb
     invoke  assets
     invoke    coffee
     create      app/assets/javascripts/greetings.js.coffee
     invoke    scss
     create      app/assets/stylesheets/greetings.css.scss

これによって一体何が作られたのでしょうか? アプリケーション内のディレクトリが確立され、コントローラファイル、ビューファイル、 機能テストファイル、ビューヘルパー、javaScriptファイル、スタイルシートが作成されました。

コントローラー(app/controllers/greetings_controller.rb)を確認し、少し手を加えてみましょう。

class GreetingsController < ApplicationController
  def hello
    @message = "Hello, how are you today?"
  end
end

ビュー(app/views/greetings/hello.html.erb)に、@messageを表示してみましょう。

<h1>A Greeting for You!</h1>
<p><%= @message %></p>

rails serverを打ち込んで、サーバーを起動してみましょう。

$ rails server
=> Booting WEBrick...

URLは、http://localhost:3000/greetings/helloです。

通常のRailsアプリケーションであれば、 URLは一般的にhttp://(host)/(controller)/(action)の形式で、 URLがhttp://(host)/(controller)のような場合、コントローラーのindexアクションが参照されます。

Railsには、モデルのためのジェネレーターも付いてます。

$ rails generate model
Usage:
  rails generate model NAME [field[:type][:index] field[:type][:index]] [options]

...

Active Record options:
      [--migration]            # Indicates when to generate migration
                               # Default: true

...

Description:
    Create rails files for model generator.

利用可能なフィールドタイプのリストは、 APIドキュメントの TableDefinitionクラスのcolumnメソッドを参照してください。

ただし、モデルを直接生成する代わりにscaffoldで設定してみましょう。 Railsのscaffoldは、モデル、そのモデルを作り出すDBマイグレーション、そのデータを操作するコントローラー、 上記のものを各々テストするための一連のファイルを生成します。

ビデオゲームのハイスコアを保持する、"HighScore"というシンプルなモデルを作るとして、 これを例に見てみましょう。

$ rails generate scaffold HighScore game:string score:integer
    invoke  active_record
    create    db/migrate/20120528060026_create_high_scores.rb
    create    app/models/high_score.rb
    invoke    test_unit
    create      test/models/high_score_test.rb
    create      test/fixtures/high_scores.yml
    invoke  resource_route
     route    resources :high_scores
    invoke  scaffold_controller
    create    app/controllers/high_scores_controller.rb
    invoke    erb
    create      app/views/high_scores
    create      app/views/high_scores/index.html.erb
    create      app/views/high_scores/edit.html.erb
    create      app/views/high_scores/show.html.erb
    create      app/views/high_scores/new.html.erb
    create      app/views/high_scores/_form.html.erb
    invoke    test_unit
    create      test/controllers/high_scores_controller_test.rb
    invoke    helper
    create      app/helpers/high_scores_helper.rb
    invoke      test_unit
    create        test/helpers/high_scores_helper_test.rb
    invoke  assets
    invoke    coffee
    create      app/assets/javascripts/high_scores.js.coffee
    invoke    scss
    create      app/assets/stylesheets/high_scores.css.scss
    invoke  scss
    create    app/assets/stylesheets/scaffolds.css.scss

ジェネレーターは、モデル、コントローラー、ヘルパー、レイアウト、機能・ユニットテスト、スタイルシートのディレクトリが存在するか調べ、 ビュー、コントローラー、モデル、HighScroreのデータベースマイグレーション(hihg_scoresテーブルとフィールドを作る)、 resourceのroute、それら全ての新しいテストを作成します。

マイグレーションにより、Rubyコード(20120528060026_create_high_scores.rb内の)を実行して、 データベースのスキーマを変更する必要があります。 データベースは何が使われるのでしょうか? Raisは、rake db:migrateを実行すると、SQLite3データベースを作成します。 Rakeについて、もう少し詳しく説明していきます。

$ rake db:migrate
==  CreateHighScores: migrating ======================
-- create_table(:high_scores)
   -> 0.0017s
==  CreateHighScores: migrated (0.0019s) =============

ユニットテストについて少しだけ説明しておきましょう。 ユニットテストは、コードの品質を担保するためにテストを行うためのコードです。 モデルで言えば、メソッドの入出力をテストします。 ユニットテストは開発者にとって友であり、ユニットテストを行うことでコードの品質はより向上し、 開発者の生活にまもなく平穏が訪れる事でしょう。

それでは、作られたものを確認してみましょう。

$ rails server

ブラウザでhttp://localhost:3000/high_scoresを開いて、 確認してみましょう。

1.4 rails console

コンソールコマンドは、コマンドラインからRailsと対話する機能を提供してくれます。 下層でRailsコンソールはIRBを使用してるので、IRBを使用したことがあればすぐに慣れることが出来るでしょう。 これはちょっとしたテストを行いたい場合に便利で、Webサイトを介さずにサーバ上のデータを変更することができます。

consoleのエイリアスである"c"を使用して、rails cとすることも可能です。

下記のようにしてコンソールコマンドの環境を指定することが可能です。

$ rails console staging

rails console --sandboxとすることで、 データ無しに様々なをテストを行うことが可能です。

$ rails console --sandbox
Loading development environment in sandbox (Rails 3.2.3)
Any modifications you make will be rolled back on exit
irb(main):001:0>

1.5 rails dbconsole

rails dbconsoleは使用しているデータベースのコマンドラインインターフェースを提供してくれます。 MySQL、PostgreSQL、SQLite、SQLite3がサポートされています。

dbconsoleのエイリアスである"db"を使用して、rails dbとすることも可能です。

1.6 rails runner

runnerは、RubyコードをRailsとの非対話形式で実行します。 例えば、

$ rails runner "Model.long_running_method"

runnerのエイリアスである"r"を使用して、rails rとすることも可能です。

-eを仕様することで、実行環境を指定することが可能です。

$ rails runner -e staging "Model.long_running_method"

1.7 rails destroy

generateの反対である、destoryがあります。 generateの実行を差し戻します。

destroyのエイリアスである"d"を使用して、rails dとすることも可能です。

$ rails generate model Oops
      invoke  active_record
      create    db/migrate/20120528062523_create_oops.rb
      create    app/models/oops.rb
      invoke    test_unit
      create      test/models/oops_test.rb
      create      test/fixtures/oops.yml
$ rails destroy model Oops
      invoke  active_record
      remove    db/migrate/20120528062523_create_oops.rb
      remove    app/models/oops.rb
      invoke    test_unit
      remove      test/models/oops_test.rb
      remove      test/fixtures/oops.yml

2. Rake

RakeはRubyのMakeであり、Unixの'make'にあたるもので、'Rakefile'と.rakeファイルを使ってタスクのリストを構築します。 Railsでは、Rakeは一般的な管理タスクに使用されます。

rake --tasksと打ち込むと、利用可能なRakeタスクの一覧を取得することが出来、これはカレントのディレクトリに依存します。 各タスクには説明がつくため、必要とするものを探す手がかりになります。

$ rake --tasks
rake about              # List versions of all Rails frameworks and the environment
rake assets:clean       # Remove compiled assets
rake assets:precompile  # Compile all the assets named in config.assets.precompile
rake db:create          # Create the database from config/database.yml for the current Rails.env
...
rake log:clear          # Truncates all *.log files in log/ to zero bytes (specify which logs with LOGS=test,development)
rake middleware         # Prints out your Rack middleware stack
...
rake tmp:clear          # Clear session, cache, and socket files from tmp/ (narrow w/ tmp:sessions:clear, tmp:cache:clear, tmp:sockets:clear)
rake tmp:create         # Creates tmp directories for sessions, cache, sockets, and pids

2.1 about

rake aboutは、Ruby,RubyGems,Rails,Railsのサブコンポーネントのバージョン番号、 アプリケーションのフォルダ、現在のRailsの環境名、データベースアダプタとスキーマのバージョンの各情報を教えてくれます。 セキュリティパッチの影響があるか、インストール済みのRailsに対し緊急パッチが必要かなどを確認するのに便利です。

$ rake about
About your application's environment
Ruby version              1.9.3 (x86_64-linux)
RubyGems version          1.3.6
Rack version              1.3
Rails version             4.0.0.beta
JavaScript Runtime        Node.js (V8)
Active Record version     4.0.0.beta
Action Pack version       4.0.0.beta
Action Mailer version     4.0.0.beta
Active Support version    4.0.0.beta
Middleware                ActionDispatch::Static, Rack::Lock, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::EncryptedCookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, Rack::Head, Rack::ConditionalGet, Rack::ETag
Application root          /home/foobar/commandsapp
Environment               development
Database adapter          sqlite3
Database schema version   20110805173523

2.2 assets

rake assets:precompileを使用して、app/assets内のファイルをプリコンパイルし、 rake assets:cleanでコンパイルされたファイルを削除することが出来ます。

2.3 db

名前空間db:の中で最も一般的なタスクは、migrateとcreateで、 それは、全てのマイグレーションのrakeタスク(up, down, redo, reset)を包括します。(翻訳に自信無し) rake db:versionは、現在のDB(マイグレーション)バージョンを教えてくれるので、DBを再構築する際などに便利です。 更に詳しく知りたければ、マイグレーションガイドを参照してください。

2.4 doc

doc:名前空間は、アプリケーションのAPIドキュメント、ガイドを生成する機能を持ちます。 また、組み込みプラットフォーム用のRailsアプリケーションを書くような場合のために、無駄なものを省く機能も持ちあわせています。

rake doc:app
doc/app内にアプリケーションのドキュメントを生成します。
rake doc:guides
doc/guides内にRailsガイドを生成します。
rake doc:rails
doc/apiにRailsのAPIドキュメントを生成します。

2.5 notes

rake notesは、コード内に存在するFIXME、OPTIMIZE、TODOで始まるコメントを検索します。 この検索は、デフォルトまたはカスタムアノテーション(注釈)の両方で拡張子が.builder、.rb、.erb、.haml、.slimのファイルに対して行われます。

$ rake notes
(in /home/foobar/commandsapp)
app/controllers/admin/users_controller.rb:
  * [ 20] [TODO] any other way to do this?
  * [132] [FIXME] high priority for next deploy

app/models/school.rb:
  * [ 13] [OPTIMIZE] refactor this code to make it faster
  * [ 17] [FIXME]

もし、注釈"FIXME"を探しているのであれば、rake notes:fixmeとして特定することが可能です。 ここで指定する注釈名は小文字であることに注意してください。

$ rake notes:fixme
(in /home/foobar/commandsapp)
app/controllers/admin/users_controller.rb:
  * [132] high priority for next deploy

app/models/school.rb:
  * [ 17]

また、カスタムアノテーション(注釈)をコード内に使用することが可能で、 rake notes:customにANNOTATION環境変数を指定することで、一覧表示することが出来ます。

$ rake notes:custom ANNOTATION=BUG
(in /home/foobar/commandsapp)
app/models/post.rb:
  * [ 23] Have to fix this one before pushing!

特定のアノテーション、カスタムアノテーション指定を行った場合、 アノテーション名(FIXME、BUG等)は出力行に表示されません。

デフォルトで、rake notesはapp、config、lib、bin、testディレクトリを検索します。 もし、他のディレクトリも検索したければ、SOURCE_ANNOTATION_DIRECTORIES環境変数にカンマ区切りでそれを指定してください。

$ export SOURCE_ANNOTATION_DIRECTORIES='spec,vendor'
$ rake notes
(in /home/foobar/commandsapp)
app/models/user.rb:
  * [ 35] [FIXME] User should have a subscription at this point
spec/models/user_spec.rb:
  * [122] [TODO] Verify the user that has a subscription works

2.6 routes

rake routesは、定義したroutesを全て一覧表示します。 これは、ルーティングに問題が起こった際に原因をたどるのに便利です。 また、アプリケーションのURLの概要を確かめるのにも使用出来ます。

2.7 test

Railsのユニットテストについては、 Railsアプリケーションのテストのガイドを参照してください。

RailsにはTest::Unitと呼ばれるテスト機能が備わっています。 Railsの安定性を確保するためにテストは欠かせない存在です。 名前空間test:で利用可能なタスクは、それぞれ異なるテストを実行する助けになってくれます。

2.8 tmp

Rails.root/tempディレクトリは、UNIX系の/tmpディレクトリのように、 セッション(もし、ファイル使用を指定した場合)、プロセスIDファイル、キャッシュアクションなどの一時ファイルを格納します。

名前空間tmp:のタスクは、Rails.root/tmpディレクトリをクリアするのに便利です。

rake tmp:cache:clear
tmp/cacheをクリアします。
rake tmp:sessions:clear
tmp/sessionsをクリアします。
rake tmp:sockets:clear
tmp/socketsをクリアします。
rake tmp:clear
cache、sessions、socketsの全てをクリアします。

2.9 Miscellaneous

rake stats
プログラムの規模を計測するのに便利で、数千行のコードであればキロ(K)単位で表示してくれます。(翻訳に自信無し)
rake secret
セッションに使用できる擬似ランダムキーを生成します。
rake time:zones:all
Railsが知り得る全てのタイムゾーンをリスト表示します。

2.10 カスタムRakeタスク

カスタムRakeタスクは、ファイル名に.rake拡張子を付け、Rails.root/lib/tasksフォルダ内に格納します。

desc "タスクの説明"
task task_name: [:prerequisite_task, :another_task_we_depend_on] do
  # :prerequisite_taskは、事前に実行するタスク名を指定
  # :another_task_we_depend_onも、依存するタスク名を指定
  # 以降は、Rubyコードを自由に書くことが可能。
end

カスタムrakeタスクに引数を渡すには、下記のようにします。

task :task_name, [:arg_1] => [:pre_1, :pre_2] do |t, args|
  # argsをここで使用可能
end

名前空間を使って、タスクをグループ分けすることが可能です。

namespace :db do
  desc "This task does nothing"
  task :nothing do
    # Seriously, nothing
  end
end

次のようにしてタスクを実行します。

rake task_name
rake "task_name[value 1]" # 全てクォーテーションで囲う必要があります
rake db:nothing

DBクエリーを実行するアプリケーションのモデルとの対話が必要であれば、 タスクはアプリケーションコードから読み込んだ環境のタスクに依存する必要があります。

3. Railsの高度なコマンドライン

更に進んだコマンドラインの使用について見てみましょう。 開発のワークフローに合わせて汎用的なオプションを使用すると便利です。 Railsが用意してくれている、いくつかのオプションを紹介します。

3.1 Railsで使用するDBとSCM(ソースコード管理システム)

Railsアプリケーションを作成する際に、使用する予定のデータベース、 ソースコード管理システムの種類をオプションで指定します。 これにより、それぞれの設定を打ち込む数分間を節約してくれます。

--git--database=postgresqlのオプションを確認してみましょう。

$ mkdir gitapp
$ cd gitapp
$ git init
Initialized empty Git repository in .git/
$ rails new . --git --database=postgresql
      exists
      create  app/controllers
      create  app/helpers
...
...
      create  tmp/cache
      create  tmp/pids
      create  Rakefile
add 'Rakefile'
      create  README.rdoc
add 'README.rdoc'
      create  app/controllers/application_controller.rb
add 'app/controllers/application_controller.rb'
      create  app/helpers/application_helper.rb
...
      create  log/test.log
add 'log/test.log'

Railsがファイルを作成して追加する前に、予めgitappディレクトリを作成し、空のgitリポジトリの初期化を行わなければいけません。 それでは、データベース設定ファイルに何が書き込まれたか確認してみましょう。

$ cat config/database.yml
# PostgreSQL. Versions 8.2 and up are supported.
#
# Install the pg driver:
#   gem install pg
# On OS X with Homebrew:
#   gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On OS X with MacPorts:
#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
development:
  adapter: postgresql
  encoding: unicode
  database: gitapp_development
  pool: 5
  username: gitapp
  password:
...
...

database.ymlの設定ファイルに選択したPostgreSQL用のいつくかの行が生成されます。

SCMオプションを使用する際の唯一の難点は、先にアプリケーションディレクトリを作成し、SCMの初期化を行ってから rails newコマンドによってアプリケーションの基盤を作成しなければならないことです。

 Back to top

© 2010 - 2017 STUDIO KINGDOM