UbuntuへのRuby、Railsのインストール Railsの使い方基本

必要であればPassengerも
Apache+PassengerでRailsを動かす

インストール

sudo apt-get update
sudo apt-get install ruby
ruby -v
gem -v (rubyのverによってはgemが入らない)
sudo apt-get install ruby-dev zlib1g-dev liblzma-dev
sudo gem install nokogiri
sudo gem install rails
rails -v

プロジェクト作成

以下は普通の流れ。

rails new xxx(ここでxxxフォルダが作成される。初回のみsqlite関連のエラーがでる)
sudo apt-get install sqlite3
sudo apt-get install sqlite3 libsqlite3-dev
sudo gem install sqlite3
sudo apt-get install nodejs
bundle install
rails s -b 0.0.0.0

インストール後プロジェクト作成

ここから自分用

rails new xxx -B -C -T -d sqlite3
B:bundleスキップ
C:ActionCable関連生成しない
T:テスト関連生成しない

もしプロジェクトを別PCからのコピーする場合。コピーしたフォルダで
bundle update
rake db:migrate
を実行する必要がある。

タイムゾーン設定

/config/application.rb

config.time_zone = ‘Tokyo’
と追加。

Gemfileを編集

ここでは
Coffee-rails
を削除し、必要であればrubyのバージョンも指定して以下を追加する。
gem ‘bootstrap’
gem ‘tether-rails’
gem ‘font-awesome-sass’
を追加し、
bundle install
を実行。

bundlerはgemのバージョン管理をするプログラムで、
gemの依存関係が書かれたgemfile.lockを生成する。
手作業で編集するのはgemfileで、gemfile.lockはいじらない。
gemfile.lockのある場所でbundle installとすると、プロジェクトに必要なgemが入る。
bundlerが読んでいるのはlockのほうで、
bundle updateをするとlockを無視し、Gemfileを元にインスト、lockの再生成する。
Gemfileの中
‘=>1.3.0’ の表記は、1.3.0 以上という意味
‘~>4.1.0’ の表記は、4.1.0 以上 4.2以下

generators.rbの編集(rails gコマンドの設定)

config/initializers
の中に
generators.rb
を作成し以下を記述。
Rails.application.config.generators do |g|
 g.helper false
 g.assets false
 g.skip_routes true
 g.test_framework false
end

 cssの設定

/assets/stylesheets/application.css
をscssに変更して、さらに同フォルダにmain.scssを作成。

application.scssには、以下を記述。
@import ‘bootstrap’;
@import ‘font-awesome-sprockets’;
@import ‘font-awesome’;
@import ‘*’;

Javascriptの設定

/assets/javascript/application.js
の中に以下を追記
//= require tether
//= require bootstrap-sprockets

モデルの作成

rails g model member
(単数形)
ここでマイグレーションクスリプトができる。

テーブル名: members
クラス定義: Member
クラスファイル: member.rb
テスト: member_test.rb

config/routes.rb

resources :members
と記述する。

マイグレーションスクリプト設定

migrateスクリプトはテーブルを定義する。
/db/migrate/xxx

参考
http://railsdoc.com/migration

データベース関連

rails new のときにデータベース接続用のymlが自動で作成される。
config/database.yml
が設定ファイル。

データベース作成・削除

rake db:create
テスト、開発用ができる。

rake db:create RAILS_ENV=production
本番用だけできる。

rake db:dropb
テスト、開発を削除できる。

rake db:dropb RAILS_ENV=production
本番用を削除できる。

テーブルの作成

rake db:migrate
テスト、開発用

rake db:migrate RAILS_ENV=production
本番用

migrateコマンドを実施するとschema.rbができる。

テーブルを作成後変更の場合、
rails g migration クラス名
でできたファイルにadd_column等を書いて再度db:migrateでOK

テーブルのバージョンを戻す場合
rake db:migrate VERSION=2015xxxx(数字の部分だけ)
rake db:rollbak(ひとつ前のバージョン)

現在のバージョン
rake db:migrate:status

テーブルの破棄(マイグレーションの書き直し)

rake db:migrate:reset

rake db:drop
rake db:create
rake db:migrate
の3つと同じ効果がある。

ちなみに、
rake db:reset
は、
rake db:drop
rake db:create
rake db:schema:load
rake db:seed
と同じ効果がある。

rake db:setup
は、
rake db:create
rake db:schema:load
rake db:seed
と同じ効果がある。

シードデータ

アプリを作ったときにdb/seeds.rbができる。
中にスクリプトを書いて以下を実行。

i  = model_class.new
i.col_name = “xxx”
i.save!
というのが基本

rake db:seed
テストと開発

rake db:seed RAILS_ENV=production
本番

でデータが挿入される。

ルーティング

root “control_name#action_name”
はルートアクセス用。これは
:root
でこのパスが取得できるようになる。

基本は
request_type path => “control_name#action_name”

as: を付けることでシンボルで指定できる。

例1

routes.rb: 
get “bad_request/:a/:b/:c” => “top#bad_request”

top_controller.rb:
  def bad_request
  render :text => “hello world” + ” ” + params[:b] + ” ” + params[:a] + ” ” + params[:c]
end

以下のアドレスでアクセスすると
http://192.168.102.15/app1/bad_request/taro/Mr/123

ブラウザには以下のように表示される。
hello world Mr taro 123

get “lesson/:action(/:name)” => “lesson”
のようにパラメータに()を付けると省略可能。
:actionに入る名称がコントローラで、そのまま呼ばれる。

コントローラの作成

rails g controller members
リソース用のコントロール作成
(CRUDのような集合に対する操作をするのは複数形、それ以外は単数形)

クラス定義: MembersController
クラスファイル: members_controller.rb
テンプレートフォルダ: app/views/members/アクション名
テスト: members_controller_test.rb

コントローラでは以下を定義していく。
index /members
new /members/123
create /members/new
show /members/123/edit
edit /members – POST
update /members/123 – PATCH
destroy /members/123 – DELETE

rails gの変更をしていなければ、コントローラ作成と同時に5個のファイルが生成される。
controllers/top_controller.rb
views/top/index.html.erb
helpers/top_helper.rb
assets/javascript/top.js
assets/stylesheets/top.scss

変更したい場合は、generators.rbを修正する。

ビューの作成

/views/controller_name/method_name.html.erb
が自動で呼ばれる。

アクションの定義がなくてもビューは呼び出される。

テンプレートの作成

全体を囲うテンプレートは、
views/layouts
に入っている。
application.html.erb
ビューが入るのは
<% yield %>

ただし、
views/layouts/controller_name.html.erb
が存在する場合、
application.html.erbより優先して、
上記のファイルが読まれる。

アクション内で
render layout: false
とすると、テンプレートが読み込まれない。
ビューは読まれる。
アクション内で、
render :text => “xxx”
とすると、xxxだけでビューもテンプレートも呼ばれない。

ヘルパーメソッド

app/helper
の中で定義する。

ビューの中で自由に使えるメソッド

バリデーション

モデルの中に書く。以下のような感じ
validates :number,presence: true, length:{ オプション }

saveが呼ばれたタイミングで登録しようとした値が正しいかチェック。

モデルの更新方法

モデルのクラスメソッド

ファインダーメソッド
find: 主キー(id)を渡す
find_by: カラム:値のハッシュを渡す

クエリメソッド
where: カラム:値のハッシュを渡す
find_by_sql: SQLを渡す。

findなどレコードで取得するのがファインダーメソッドで、モデルに直接使う(クラスメソッド)
レコードはモデルオブジェクトとなる。

whereなどのクエリメソッドだとリレーションオブジェクトが返ってくる。検索条件を保持している。
リレーションオブジェクトにはファインダーメソッドが使える。

開発時のモード

development: 開発
test: 自動テスト用
production: 本番

railsやrakeコマンドは実行時に
RAILS_ENV
の中の環境変数によって動作が変わってくる。

コードの中でも
Rails.env.development?

Rails.env.production?
などでtrue/falseで確認できる。