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アプリケーションを書くような場合のために、無駄なものを省く機能も持ちあわせています。
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ディレクトリをクリアするのに便利です。
2.9 Miscellaneous
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コマンドによってアプリケーションの基盤を作成しなければならないことです。
© 2010 - 2017 STUDIO KINGDOM