Ruby on Rails チュートリアルでの備忘録

やっとRuby on Rails チュートリアル 実例を使ってRailsを学ぼうを始めました。

これまでの学習では取りこぼしている事項があったので、それらをまとめておきたいと思います。

コントローラー作成時にメソッド他も一緒に生成する

1
>rails g controller [コントローラ名] [アクション名] ...

とすることで、[アプリケーションルート]\app\controllers[コントローラー名]_controller.rbが作成される。

作成されたコントローラは以下のようになる。

1
2
3
4
5
6
7
8
class [コントローラ名]Controller < ApplicationController
def [アクション名]
end

def [アクション名]
end

end

更に、[アプリケーションルート]\app\views[コントローラ名] 以下に
[アクション名].html.erbファイルが生成される。

さらに[アプリケーションルート]\config\routes.rbにルーティングも記述される

1
2
3
4
5
Rails.application.routes.draw do
get '[コントローラ名]/[アクション名]'
get '[コントローラ名]/[アクション名]'
# 以下省略
end

この時コントローラ名をキャメルケースで記述したとき、作成されるファイルはスネークケースになる。

コントローラ作成の取り消し

1
>rails g controller [コントローラ名] [アクション名] ...

のようにコントローラを作成したとき

1
>rails d(destroy) controller [コントローラ名] [アクション名] ...

の実行でコントローラを削除できる
削除したとき[アプリケーションルート]\config\routes.rbに記述されたルーティングも削除される。

テスト実行

以下コマンドで定義されたテストが実行される。

1
>rails t

コントローラでのテスト定義された物は以下のようになっている。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
test "should get home" do
get static_pages_home_url
assert_response :success
end

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

test "should get About" do
get static_pages_About_url
assert_response :success
end

end

このままテスト実行すれば、3つそれぞれアクセスできてテストはパスできる。

あえてroutes.rbのルーティングを外してやると、エラー発生することを確認できる。

assert_response

レスポンスがあることをテストする
以下のように書く

1
2
3
4
5
6
7
8
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
test "Will Responce" do
get [テスト対象のURL]
assert_response :success
end
end

assert_select

レスポンスの中の特定のタグを取り出し、指定した記述があることをテストする
以下のように書く

1
2
3
4
5
6
7
8
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
test "Will Responce" do
get [テスト対象のURL]
assert_select "p","TestText"
end
end

setupメソッド定義

テスト記述するクラス内でsetupメソッドを定義すると、
テスト実行前に一度実行してくれる。
テスト項目の共通部分の定義などに使用する。

1
2
3
4
5
6
7
8
9
10
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

def setup
@sharestring = "共通部分"
end

#以下省略
end

カスタムヘルパーの作成

[アプリケーションルート]\app\helpers\application_helper.rbにメソッドを追加することで、ヘルパーを作成できる。
このヘルパーは.erbの中で呼び出せる。

現在時刻を取得するヘルパーなら、以下のようになる。
(表示回りはもっときれいにする必要がありそうだけれど・・・)

[アプリケーションルート]\app\helpers\application_helper.rb
1
2
3
4
5
module ApplicationHelper
def now_time
Time.now
end
end

ハッシュ、シンボル

以下の二つの定義は同じものである

1
2
a = { :name => "string"}
b = { name: "string"}

どちらもハッシュのキーをシンボルにするものである。
後者の書き方はRuby1.9からサポートされた書き方

bootstrapの追加

Gemfileに以下の記述を追加しインストールする

1
2
3
#gem 'bootstrap-sass', '3.3.7'がチュートリアルでの解説だったが、
#https://rubygems.org/を調べると最新版は3.4.1だったのでこちらでやってみる。
gem 'bootstrap-sass', '3.4.1'
1
>bundle install

skelton CSSを使いたいときは

自身がよく使うCSSライブラリはskeltonなのだけどgemでインストールする場合は、
helios-technologies/skeleton-railsから、

1
gem 'skeleton-rails', :git => 'https://github.com/helios-technologies/skeleton-rails'

を記載して以下のコマンドでインストール

1
>rails g skeleton:install

app/assets/stylesheets/application.cssに以下の記載を追加する

1
2
= require normalize
= require skeleton

これで動くそうだ

SCSSの追加

[アプリケーションルート]\app\helpers[任意名称].scssを作成する。
この[任意名称].scssに定義を追加することで独自のスタイルを定義できる。
これは[アプリケーションルート]\app\assets\stylesheets\application.cssの記述で定義している2行において、すべてのscssとcssをまとめて読み込むせっていになっている。

[アプリケーションルート]\app\assets\stylesheets\application.css抜粋
1
2
3
4
/*
*= require_tree .
*= require_self
*/

しかし、これだとアプリケーション全体に適用されることになり、
特定のページだけ別のものを充てることができない。

を参考にすると、

[アプリケーションルート]\app\assets\stylesheets\application.cssから
*= require_tree .を削除する。

1
2
3
4
5
/*
以下削除する。
*= require_tree .
省略
*/

[アプリケーションルート]\config\initializers\assets.rbに以下の記述を追加

1
Rails.application.config.assets.precompile += %w( [ファイル名].scss )

ビューになる.erbで以下を記述する。

1
<%= stylesheet_link_tag '[ファイル名]' %>

この3行程でページ個別のcssを定義できるようだ。

上記以外に、ページごとにbodyタグの割り当てクラスを変更してそれでコントロールしているものもあった。せっかくsass使っているんだしという話。

データベース保存時の規定の処理を設定する。

[アプリケーションルート]\app\models[モデル名].rbを編集し、before_saveを追加する。
例えば、保存前に特定カラムの内容を小文字に変える場合は以下のようになる。
(参照元では、メールアドレスでこの処理を実施)

[アプリケーションルート]\app\models\[モデル名].rb
1
2
3
4
5
6
7
class [モデル名] < ApplicationRecord
before_save {self.[カラム名] = self.[カラム名].downcase}
#または
before_save {self.[カラム名] = [カラム名].downcase}
#もしくは
before_save {[カラム名].downcase!}
end

モデル構造の変更

一度作ったモデルの内容を変更したいとき(カラム追加とか)は、マイグレーションファイルを作成する。

1
>rails generate migration [任意名称]

[アプリケーションルート]\db\migrate[日時文字列][任意名称.rb]が作成される。
作成された[アプリケーションルート]\db\migrate[任意名称.rb]のchangeメソッド内で、定義する。
add_columnを使用して設定する。

[アプリケーションルート]\db\migrate\[任意名称.rb]
1
2
3
4
5
class AddPasswordDigestToUsers < ActiveRecord::Migration[5.2]
def change
add_column :[テーブル名], :[カラム名], :[データベース型]
end
end

以下のように記載するとファイルを変種る必要が無い。

1
>rails generate migration add_password_digest_to_[テーブル名] [増やしたいカラム名]:[データベース型]

マイグレーションファイルを作成後に
rails db:migrate及びrails db:migrate RAILS_ENV=testを実行する。

rails db:migrate RAILS_ENV=testはテスト用データベースへの展開、これがないと関連事項でのテストでつまずく。

debugger

コントローラで、
以下のようにdebuggerメソッドを記述する。

1
2
3
4
def show
@user = User.find(params[:id])
debugger
end

このメソッドを通過するように、アクセスするとrails sを実行したコンソールで
(byebug)を表示し、入力待ちする。
ここで、上記のコードなら@userと入力することでオブジェクトの中を見ることができる。
他にも定義のある変数は参照できる。

Ctrl+Dを入力することで終了できる。

activerecordでID以外で検索

1
[モデル名].find_by([カラム名]:[検索文字列])

結構な文字数になったので、ここでいったん切る。
まだまだメモする事項が多いのだけど、「これRuby on Rails チュートリアル 実例を使ってRailsを学ぼうを素直に読めばいいじゃない?」と原点に戻った。
別途、Ruby on Rails チュートリアル 実例を使ってRailsを学ぼうの内容通りできなかった部分だけ記載して、以後この件の記事はないかも。

ではでは。