Ruby
Rails

Railsチュートリアルで押さえておくべきポイント 1〜4章


minitestの書き方とタイトルの表示切り替え

なぜコントローラーのテストを実装するのか

- ルーティング通りにアクセスし、期待するページを表示出来ているかどうか

- 表示されたページの文言が期待するものであるかどうか

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

def setup
@base_title = "Ruby on Rails Tutorial Sample App"
end

test "should get home" do
get static_pages_home_url
assert_response :success
#特定のHTMLタグが存在するかどうかをテストします
#(この種のアサーションメソッドはその名から「セレクタ」と呼ばれることもある。
assert_select "title", "Home | #{@base_title}"
end
end

setupメソッドは、テストが実行される直前で呼ばれる。

→リファクタリングで使用。

# この書き方は、application.html.rbが無い場合。railsを使うならこの方法は一般的では無い。

<% provide(:title, "Home") %>
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
</head>
<body>
<h1>Sample App</h1>

↓railsで実装するなら↓


app/views/layouts/application.html.erb

<!DOCTYPE html>

<html>
<head>
<title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all',
'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application',
'data-turbolinks-track': 'reload' %>
</head>


app/views/static_pages/home.html.erb

<% provide(:title, "Home") %>

<h1>Sample App</h1>
<p>
This is the home page for the
<a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>
sample application.
</p>

provideの:titleが空の場合、無駄な「|」が入ってします。これを防ぐために、カスタムヘルパーを定義する。


app/helpers/application_helper.rb

module ApplicationHelper

# ページごとの完全なタイトルを返します。
# メソッド定義とオプション引数。
#引数にデフォルト値を含めている。 (この例のデフォルト値は空の文字列です)。このように指定すると、page_title変数に引数を渡すことも渡さないこともできます。引数を渡さない場合は、指定のデフォルト値(この場合は空の文字列)を渡すことができる。
def full_title(page_title = '')
base_title = "Ruby on Rails Tutorial Sample App"
if page_title.empty?
base_title
else
page_title + " | " + base_title
end
end
end


カスタムヘルパーを定義し、以下のように修正をする。


application.html.erb

<title><%= full_title(yield(:title)) %></title>



Unixのプロセス

プロセスを確認できる。

$ ps aux

プロセスの種類を指定してフィルタするには、psの結果をUnixの「パイプ」|でつないで、パターンマッチャーであるgrepに渡す。

※Springは「rails server」「rails console」「rake」コマンドが速くなる、Railsの新しいプリローダー

$ ps aux | grep spring

$ ps aux | grep server

プロセスid、略してpidを使い。不要なプロセスを排除するには、killコマンドでpidを指定し、Unixのkillコードを発行。

# 9はシグナル番号。

$ kill -9 [PID]

開発中に動作がおかしくなったりプロセスがフリーズしていると思えたら、すぐにps auxで状態を確認し、kill -15 やpkill -15 -f <プロセス名>で整理してみましょう。

$ spring stop

# spring stopが効かなかったら、下記で一気にspringプロセスをkillする。
$ pkill -9 -f spring


文法における盲点

シングルクォートは、入力した文字をエスケープせずに「そのまま」保持するときに便利。

>> '\n'       # 'バックスラッシュ n' をそのまま扱う

=> "\\n"

# ”\n”になると改行を意味してしまう。"\\n"をシングルクォートを使えば、実装が楽。

オブジェクトとは (いついかなる場合にも) メッセージに応答するものです。

Ex,文字列のようなオブジェクトは、例えばlengthというメッセージに応答する

# if文の違う書き方

puts "x is not empty" if !x.empty?

#「!!」(「バンバン (bang bang)」と読みます) という演算子を使うと、そのオブジェクトを2回否定することになるので、どんなオブジェクトも強制的に論理値に変換できる
>> !!nil
=> false
>> !!0
=> true

Rubyのメソッドには「暗黙の戻り値がある」ことにご注意。これは、メソッド内で最後に評価された式の値が自動的に返されることを意味します (訳注: メソッドで戻り値を明示的に指定しなかった場合の動作です)

なので、以下のような場合は、returnが必要。

def string_message(str = '')

return "It's an empty string!" if str.empty?
"The string is nonempty."
end

splitメソッド(文字列を処理して配列を返す)

>>  "foo bar     baz".split     # 文字列を3つの要素を持つ配列に分割する

=> ["foo", "bar", "baz"]

>> "name".split('')
=> ["n", "a", "m", "e"]
>> "name".split
=> ["name"]

>> "fooxbarxbaz".split('x')
=> ["foo", "bar", "baz"]

joinメソッド(splitの逆の処理。配列を処置して文字列を出力)

>> a

=> [42, 8, 17, 6, 7, "foo", "bar"]
>> a.join # 単純に連結する
=> "4281767foobar"
>> a.join(', ') # カンマ+スペースを使って連結する
=> "42, 8, 17, 6, 7, foo, bar"

>> a = %w[foo bar baz quux]         # %wを使って文字列の配列に変換

=> ["foo", "bar", "baz", "quux"]
>> a = (0..9).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>> ('a'..'e').to_a
=> ["a", "b", "c", "d", "e"]

# 範囲(レンジ)と配列は蜜に関係している。
(1..5).each { |i| puts 2 * i }

>> (1..5).map { |i| i**2 } # 「**」記法は冪乗 (べき乗)
=> [1, 4, 9, 16, 25]

# mapとjoinは繋げられる
def yeller(s)
s.map(&:upcase).join
end
=> :yeller

yeller(['o','l','d'])
=> "OLD"

# 以上ことを把握できれば、以下が理解できる。
('a'..'z').to_a.shuffle[0..7].join

>> p :name # 'puts :name.inspect' と同じ
:name

>> params = {}        # 'params' というハッシュを定義する ('parameters' の略)。

=> {}
>> params[:user] = { name: "Michael Hartl", email: "mhartl@example.com" }
=> {:name=>"Michael Hartl", :email=>"mhartl@example.com"}
>> params
=> {:user=>{:name=>"Michael Hartl", :email=>"mhartl@example.com"}}
>> params[:user][:email]
=> "mhartl@example.com"

>> class String             # WordクラスはStringクラスを継承する

>> # 文字列が回文であればtrueを返す
>> def palindrome?
>> self == self.reverse # selfは文字列自身を表します
>> end
>> end
=> :palindrome?

selfはオブジェクト(インスタンス)をさす。

self == reverseと、selfの省略も可能。

"aaa"はStringクラスのインスタンス


IE9への対応

念のため、以下のタグを

タグに入れた方が良い

<!--[if lt IE 9]>

<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/r29/html5.min.js">
</script>
<![endif]-->


 画像の格納場所

assetのコンパイル対象にしたいならassets配下。

ブラウザのキャッシュコントロールのためのバージョン管理化に置かれなくていいならpublic配下に置く。基本的にはシステム側で作る画像はassets以下、ユーザー側のアップロードする画像はpublic配下に置いておく。

ただ、表示速度を重視したい背景画像などは、public配下に置くと良い。

↓先頭に/(スラッシュ)をつけると、public配下になる。

<%= image_tag '/images/hoge.png' %>


yarnを使わず、gemでbootstrapを導入する方法

https://github.com/twbs/bootstrap-rubygem

# できるだけ、カスタムCSSは、一つのファイルで編集する

$ touch app/assets/stylesheets/custom.scss


app/assets/stylesheets/custom.scss

# 以下をimport

@import "bootstrap";


統合テスト

まずは、ファイルを下記コマンドで生成する。



$ rails generate integration_test site_layout


test/integration/site_layout_test.rb

require 'test_helper'

class SiteLayoutTest < ActionDispatch::IntegrationTest

#特定のリンクが存在するかどうかを、aタグとhref属性をオプションで指定して調べている
test "layout links" do
get root_path
assert_template 'static_pages/home'
assert_select "a[href=?]", root_path, count: 2
assert_select "a[href=?]", help_path
assert_select "a[href=?]", about_path
assert_select "a[href=?]", contact_path
end
end



#統合テストのみ流したい場合、これ使う。
$ rails test:integration

Applicationヘルパーで使っているfull_titleヘルパーを、

test環境でも使えるようにすると便利らしい。

→minitestでは、ヘルパーメソッドを定義していたら、別途test環境でもincludeする必要がある。このことから、最初からrspec使った方が、いいかもと感じる。