新しいRubyのバージョンがrbenvに表示されない時はgit pullする
Rubyのバージョン調べてみると2.2.3
だったので、2.2.4以上をインストールすべく
$ brew update $ brew upgrade rbenv ruby-build
をやってインストールできるバージョン一覧を表示
$ rbenv install --list (略) 2.2.1 2.2.2 2.2.3 (略)
しかし、2.2.3以上のバージョンが表示されない。。。
で、調べてみるとruby-build
をgit pull
すれば良いそうだ
$ cd ~/.rbenv/plugins/ruby-build $ git pull
再度表示すると2.2.4、2.2.5が出現!!
$ rbenv install --list (略) 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 (略)
めでたし。めでたし。
Ruby on Rails チュートリアル4章の前半まとめてみた
こんちには、opiyoです。
人生の生き残りをかけて始めた「Railsブートキャンプ」ですが、今日はRailsチュートリアル第4章をやっていこうと思います。
第4章は「Ruby」のお勉強です。早速やってみましょう!
あまりにもボリューミーなので、2回に分けます。この記事では「4.3 他のデータ構造までを」。
前回までのをまとめたのはこちらからどうぞ。
この章から始められる場合も、3章の「セットアップ」を参考に準備してください。
railsチュートリアル4章の解説
カスタムヘルパー
Railsのビューからは色々な関数が定義れています。
これは、自分で定義することもでき「カスタムヘルパー」と呼びます。
ここでは、3章で作成した各ビューで定義しているタイトルをヘルパーを使って定義します。
# app/helpers/application_helper.rb module ApplicationHelper # ページごとの完全なタイトルを返します。 def full_title(page_title = '') base_title = "Ruby on Rails Tutorial Sample App" if page_title.empty? # empty?は空っぽだったら「true」を返す base_title else page_title + " | " + base_title end end end
文字列とメソッド
$ rails console #ターミナルに潜り込みます
>>
このターミナルを使って簡単なRubyの勉強
コメントアウト
name = test * test # この「#」がコメントアウト
end
足し算
> 17 +42 => 59
文字列の連結
> "foo" + "bar" => "foobar"
式展開
> first_name = "Taku" > "#{first_name} Nakano" => "Taku Nakano"
出力
> puts "foo" # putsだと末尾に自動で改行コードが付与されるされる foo => nil > print "foo" # 文字が続いているのがわかる foo=> nil
シングルクォート内の文字列
> first_name = 'Taku' > '#{first_name} Nakano' => "\#{first_name} Nakno" # シングルクォートの場合は式展開されないので注意!
オブジェクトとメッセージ
Rubyでは文字列も、nilも何でもかんでもオブジェクトです。
例えば、文字列の数を知りたい場合はkength
メソッドを使います。
> "foobar".length # 文字列に "length" というメッセージを送る => 6
条件分岐
if
を使って処理を分岐することができる- 2つ以上にしたい時は
elsif
を使う - and(&&) や or(||) を使える
> if s.nil? > "The variable is nil" > elsif s.empty? > "The string is empty" > elsif s.include?("foo") > "The string includes 'foo'" > end => "The string includes 'foo'" > x = "foo" => "foo" > y = "" => "" > puts "Both strings are empty" if x.empty? && y.empty? => nil > puts "One of the strings is empty" if x.empty? || y.empty? "One of the strings is empty" => nil > puts "x is not empty" if !x.empty? "x is not empty" => nil
メソッドの定義
メソッドは先ほど作ったカスタムヘルパーや、homeアクションやhelpアクションなどもそうですね。
def hogehoge(メソッド名) end
で定義できる- 引数にデフォルト値を含めることが可能
def string_message(str = '')
- この場合は引数を指定しないと
str = ''
がセットされる
- この場合は引数を指定しないと
配列と範囲演算子
文字列の分割
> "foo bar baz".split # デフォルトは「空白」で分割する => ["foo", "bar", "baz"] > "fooxbarxbazx".split('x') # 引数を指定すればそれで分割できる => ["foo", "bar", "baz"]
配列の中身を取り出す
a = [42, 8, 17] => [42, 8, 17] > a[0] # 0が一番目の要素になるので要注意! => 42 > a[1] => 8 > a[2] => 17 > a[-1] # マイナスの場合は後ろから数える! => 17 > a.first => 42 > a.second => 8 > a.last => 17 > a.last == a[-1] => true
いろいろなメソッド
a => [42, 8, 17] > a.empty? # 配列が空であればtrue、1つ以上何か値があればfalseを返します。 => false > a.include?(42) => true > a.sort => [8, 17, 42] > a.reverse => [17, 8, 42] > a.shuffle => [8, 42, 17] > a => [42, 8, 17] # いろいろやっても値は「変わらない!」ことに気をつけましょう。 > a.sort! # 「!」などの破壊的メソッドと呼ばれるメソッドを使うと強制的に値を書き換えます。 => [8, 17, 42] > a => [8, 17, 42]
値の追加
> a.push(6) => [42, 8, 17, 6] irb(main):044:0> a << 7 => [42, 8, 17, 6, 7] irb(main):045:0> a << "foo" << "bar" => [42, 8, 17, 6, 7, "foo", "bar"]
結合
> a => [42, 8, 17, 6, 7, "foo", "bar"] > a.join => "4281767foobar" > a.join(",") => "42,8,17,6,7,foo,bar"
範囲
> 0..9 => 0..9 irb(main):064:0> 0..9.to_a NoMethodError: undefined method `to_a' for 9:Integer # 9に対して`to_a`してるのでエラーになります Did you mean? to_s to_c to_f to_i to_d to_r . . from -e:1:in `<main>' irb(main):065:0> (0..9).to_a # ()を付けて範囲に対して`to_a`していることを伝えてあげます => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] > a = %w(foo bar baz quux) => ["foo", "bar", "baz", "quux"] > a[0..2] => ["foo", "bar", "baz"] > ('a'..'e').to_a # 文字でも使える!すごいねRuby! => ["a", "b", "c", "d", "e"]
ブロック
- ブロックは「{ }」のことで、「do end」で囲って表現する場合もあります。
- 短い1行のブロックには波かっこを使用し、長い1行や複数行のブロックにはdo..end記法を使うのが一般的
例えば、以下は1~5を順番に変数i
に渡してputs 2 * i
を実行するというような処理になります。
> (1..5).each { |i| puts 2 * i } 2 4 6 8 10 => 1..5 > (1..5).each do |i| * puts i * 2 > end 2 4 6 8 10 => 1..5
mapメソッド
> 3.times { puts "Betelgeuse!" } # 3.timesではブロックに変数を使用していない "Betelgeuse!" "Betelgeuse!" "Betelgeuse!" => 3 > (1..5).map { |i| i**2 } # 「**」記法は冪乗 (べき乗) => [1, 4, 9, 16, 25] # 配列で帰ってくる # 同じ結果をeachでやるには、こんな感じ? > array = [] => [] > (1..5).each do |i| * array << i ** 2 > end => 1..5 > array => [1, 4, 9, 16, 25] > %w[a b c] => ["a", "b", "c"] > %w[a b c].map {|char| char.upcase} => ["A", "B", "C"] > %w[a b c].map {|char| char.downcase} => ["a", "b", "c"] > %w[A B C].map(&:downcase) # 省略できる => ["a", "b", "c"]
ハッシュとシンボル
- ハッシュとはインデックス([]の中身)に整数値以外のものも使用できる点が配列と違う
- ハッシュは「{}」を使って表記する
- ブロックの「{}」とは全く違う
- ハッシュでは要素の「並び順」が保証されない
user = {} => {} > user["first_name"] = "Michael" => "Michael" > user["last_name"] = "Hartl" => "Hartl" > user["first_name"] => "Michael" > user => {"first_name"=>"Michael", "last_name"=>"Hartl"} > user = { "first_name" => "Michael", "last_name" => "Hartl" } => {"last_name"=>"Hartl", "first_name"=>"Michael"}
- シンボルとはコロンが前に置かれている文字列
- 文字列と似ているが異なる
- Railsでは文字列よりもシンボルを使用する
- 文字列と違って全ての文字が使えるわけではない
- ハッシュもeachメソッド
> "name".split('') => ["n", "a", "m", "e"] > :name.split('') NoMethodError: undefined method `split' for :name:Symbol > "foobar".reverse => "raboof" > :foobar.reverse NoMethodError: undefined method `reverse' for :foobar:Symbol > :foo-bar NameError: undefined local variable or method `bar' for main:Object > :2foo SyntaxError > user = { :name => "Michael Hartl", :email => "michael@example.com" } => {:name=>"Michael Hartl", :email=>"michael@example.com"} > user[:name] => "Michael Hartl" > user[:password] => nil > h1 = { :name => "Michael Hartl", :email => "michael@example.com" } => {:name=>"Michael Hartl", :email=>"michael@example.com"} > h2 = { name: "Michael Hartl", email: "michael@example.com" } # 別の書き方 これもよく見る => {:name=>"Michael Hartl", :email=>"michael@example.com"} > h1 == h2 => true > params = {} => {} > 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"
その他
app/views/layouts/application.html.erb
に書かれている以下の2行は色々な要素が省略されているのに注意!
stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' # メソッド呼び出しの丸かっこは省略可能。 stylesheet_link_tag('application', media: 'all', 'data-turbolinks-track': 'reload') # 最後の引数がハッシュの場合、波かっこは省略可能。 stylesheet_link_tag 'application', { media: 'all', 'data-turbolinks-track': 'reload' } # htmlだとこうなります <link data-turbolinks-track="true" href="/assets/application.css" media="all" rel="stylesheet" />
railsチュートリアル4章の演習問題
演習
<問題1>
city変数に適当な市区町村を、prefecture変数に適当な都道府県を代入してください。
<回答1>
prefecture = "岡山県" => "岡山県" city = "倉敷市" => "倉敷市"
<問題2>
先ほど作った変数と式展開を使って、「東京都 新宿区」のような住所の文字列を作ってみましょう。出力にはputsを使ってください。
<回答2>
> puts prefecture + " " + city 岡山県 倉敷市 > puts "#{prefecture} #{city}" 岡山県 倉敷市
<問題3>
上記の文字列の間にある半角スペースをタブに置き換えてみてください。(ヒント: 改行文字と同じで、タブも特殊文字です)
<回答3>
> puts "#{prefecture} \t #{city}" 岡山県 倉敷市
<問題4>
タブに置き換えた文字列を、ダブルクォートからシングルクォートに置き換えてみるとどうなるでしょうか?
<回答4>
> puts '#{prefecture} \t #{city}' #{prefecture} \t #{city}
演習
<問題1>
"racecar" の文字列の長さはいくつですか? lengthメソッドを使って調べてみてください。
<回答1>
> "racecar".length => 7
<問題2>
reverseメソッドを使って、"racecar"の文字列を逆から読むとどうなるか調べてみてください。
<回答2>
> "racecar".reverse => "racecar"
<問題3>
変数sに "racecar" を代入してください。その後、比較演算子 (==) を使って変数sとs.reverseの値が同じであるかどうか、調べてみてください。
<回答3>
> s = "racecar" => "racecar" irb(main):013:0> s == s.reverse => true
<問題4>
リスト 4.9を実行すると、どんな結果になるでしょうか? 変数sに "onomatopoeia" という文字列を代入するとどうなるでしょうか? ヒント: 上矢印 (またはCtrl-Pコマンド) を使って以前に使ったコマンドを再利用すると一からコマンドを全部打ち込む必要がなくて便利ですよ。)
<回答4>
> puts "It's a palindrome!" if s == s.reverse It's a palindrome! => nil > s = "onomatopoeia" => "onomatopoeia" > puts "It's a palindrome!" if s == s.reverse => nil
演習
<問題1>
リスト 4.10のFILL_INの部分を適切なコードに置き換え、回文かどうかをチェックするメソッドを定義してみてください。ヒント: リスト 4.9の比較方法を参考にしてください。 ※回文・・・上から読んでも下から読んでも、同じ言葉になる文句
<回答1>
> def palindrome_tester(s) > if s == s.reverse > puts "It's a palindrome!" > else > puts "It's not a palindrome." > end > end
<問題2>
上で定義したメソッドを使って “racecar” と “onomatopoeia” が回文かどうかを確かめてみてください。1つ目は回文である、2つ目は回文でない、という結果になれば成功です。
<回答2>
> palindrome_tester("racecar") It's a palindrome! => nil > palindrome_tester("onomatopoeia") It's not a palindrome. => nil
<問題3>
palindrome_tester("racecar")に対してnil?メソッドを呼び出し、戻り値がnilであるかどうかを確認してみてください (つまりnil?を呼び出した結果がtrueであることを確認してください)。このメソッドチェーンは、nil?メソッドがリスト 4.10の戻り値を受け取り、その結果を返しているという意味になります。
<回答3>
> palindrome_tester("racecar").nil? It's a palindrome! => true > if palindrome_tester("racecar").nil? > puts "TRUE" > end It's a palindrome! TRUE
演習
<問題1>
文字列 “A man, a plan, a canal, Panama” を ", " で分割して配列にし、変数aに代入してみてください。
<回答1>
> a = "A man, a plan, a canal, Panama".split(",") => ["A man", " a plan", " a canal", " Panama"]
<問題2>
今度は、変数aの要素を連結した結果 (文字列) を、変数sに代入してみてください。
<回答2>
> s = a.join => "A man a plan a canal Panama"
<問題3>
変数sを半角スペースで分割した後、もう一度連結して文字列にしてください (ヒント: メソッドチェーンを使うと1行でもできます)。リスト 4.10で使った回文をチェックするメソッドを使って、(現状ではまだ) 変数sが回文ではないことを確認してください。downcaseメソッドを使って、s.downcaseは回文であることを確認してください。
<回答3>
> s.split(" ") => ["A", "man", "a", "plan", "a", "canal", "Panama"] > s.split(" ").join => "AmanaplanacanalPanama" > s_down = s.downcase => "amanaplanacanalpanama" > s_down == s_down.reverse => true
<問題4>
aからzまでの範囲オブジェクトを作成し、7番目の要素を取り出してみてください。同様にして、後ろから7番目の要素を取り出してみてください。(ヒント: 範囲オブジェクトを配列に変換するのを忘れないでください)
<回答4>
> az = ("a".."z").to_a => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] > az[7 - 1] => "g" > az[-7] => "t"
演習
<問題1>
範囲オブジェクト0..16を使って、各要素の2乗を出力してください。
<回答1>
> (0..16).map {|i| puts i ** 2} 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256
<問題2>
yeller (大声で叫ぶ) というメソッドを定義してください。このメソッドは、文字列の要素で構成された配列を受け取り、各要素を連結した後、大文字にして結果を返します。例えばyeller([’o’, ’l’, ’d’])と実行したとき、"OLD"という結果が返ってくれば成功です。ヒント: mapとupcaseとjoinメソッドを使ってみましょう。
<回答2>
> def yeller(array) > puts array.join.upcase > end => :yeller > yeller(%w(o l d)) OLD
<問題3>
random_subdomainというメソッドを定義してください。このメソッドはランダムな8文字を生成し、文字列として返します。ヒント: サブドメインを作るときに使ったRubyコードをメソッド化したものです。
<回答3>
> def random_subdomain > ('a'..'z').to_a.shuffle[0..7].join > end => :random_subdomain > random_subdomain => "ikzbpahe"
<問題4>
リスト 4.12の「?」の部分を、それぞれ適切なメソッドに置き換えてみてください。ヒント:split、shuffle、joinメソッドを組み合わせると、メソッドに渡された文字列 (引数) をシャッフルさせることができます。
<回答4>
> def string_shuffle(s) > s.split("").shuffle.join # splitに「""」を渡すと1文字ずつ分割してしてくれる > end > string_shuffle("foobar") => "oobfra"
演習
<問題1>
キーが’one’、’two’、’three’となっていて、それぞれの値が’uno’、’dos’、’tres’となっているハッシュを作ってみてください。その後、ハッシュの各要素をみて、それぞれのキーと値を"’#{key}’のスペイン語は’#{value}’"といった形で出力してみてください。
<回答1>
> hash => {:one=>"uno", :two=>"dos", :three=>"tres"} * hash.each do |k,v| * puts "#{k}のスペイン語は#{v}です" > end oneのスペイン語はunoです twoのスペイン語はdosです threeのスペイン語はtresです => {:one=>"uno", :two=>"dos", :three=>"tres"}
<問題2>
person1、person2、person3という3つのハッシュを作成し、それぞれのハッシュに:firstと:lastキーを追加し、適当な値 (名前など) を入力してください。その後、次のようなparamsというハッシュのハッシュを作ってみてください。1.) キーparams[:father]の値にperson1を代入、2). キーparams[:mother]の値にperson2を代入、3). キーparams[:child]の値にperson3を代入。最後に、ハッシュのハッシュを調べていき、正しい値になっているか確かめてみてください。(例えばparams[:father][:first]がperson1[:first]と一致しているか確かめてみてください)
<回答2>
> params[:father] = person1 => {:first=>"nakano", :last=>"taku"} > params[:mother] = person2 => {:first=>"nakano", :last=>"haku"} > params[:child] = person3 => {:first=>"nakano", :last=>"toma"} > params[:father][:first] == person1[:first] => true > params[:mother][:first] == person2[:first] => true > params[:child][:first] == person3[:first] => true
<問題3>
userというハッシュを定義してみてください。このハッシュは3つのキー:name、:email、:password_digestを持っていて、それぞれの値にあなたの名前、あなたのメールアドレス、そして16文字からなるランダムな文字列が代入されています。
<回答3>
> user = {} => {} > user[:name] = "Taku" => "Taku" > user[:email] = "kosmo.waizu0804@gmail.com" => "kosmo.waizu0804@gmail.com" > > user[:password_digest] = ("a".."z").to_a.shuffle[0..15].join => "fpnewraocjbhustg" > user => {:name=>"Taku", :email=>"kosmo.waizu0804@gmail.com", :password_digest=>"fpnewraocjbhustg"}
<問題4>
Ruby API (訳注: もしくはるりまサーチ) を使って、Hashクラスのmergeメソッドについて調べてみてください。次のコードを実行せずに、どのような結果が返ってくるか推測できますか? 推測できたら、実際にコードを実行して推測があっていたか確認してみましょう。
<回答4>
> { "a" => 100, "b" => 200 }.merge({ "b" => 300 }) => {"a"=>100, "b"=>300}
railsチュートリアル4章の気になる!
その他メモ
- 新しいブランチの作り方
$ git checkout -b rails-flavored-ruby Switched to a new branch 'rails-flavored-ruby' $ git branch master * rails-flavored-ruby
第4章まだ途中ですが、ここで一度アップ!
1万文字超えてるではないか...
ユニクロではなく無印良品を選ぶ3つの理由
こんにちは。opiyoです。
岡山は今梅雨入り初めての雨が降っていますが、「晴れたらやりたいこと」は何でしょうか?
私は熱狂的なユニクロファンで赤色の靴下、パンツ、ジーパン、Tシャツ、パーカー全てがユニクロです。
先日痛くないハイヒールを作っている「瀧見サキ」さんの記事を書きましたが、この瀧見サキさんの格好が個人的にはドストライクで、めちゃくちゃ格好良いのですよ。
これ、無印っぽいので久しぶりに岡山イオンの無印良品に遊びに行ったのですが、そこには僕の知らないアイテム達が待ち構えていました
VネックTシャツ 2枚組(1490円)
無印良品って昔は多分Uネックしかなかったんじゃないかなぁ。
https://www.muji.net/store/cmdty/detail/4549738732082?searchno=11
タンクトップ 2枚組(1490円)
タンクトップも昔は無印良品なかったんじゃないかなぁと思うんだけど、自信ないな。
今はビックシルエットが流行ってるから旨味がないかもだけど、白のTシャツ着るときはグレーのタンクトップ着て1cmくらいTシャツから飛び出して見せると全体が引き閉まるからオススメです!
https://www.muji.net/store/cmdty/detail/4549738536451?searchno=1
ポケット付きTシャツ
通販サイトでは見つからなかった。こういうちょっとオシャレなものって全然なかったと思うんだど。どうだろうか。
これは普通にメンズだけじゃなくてレディースもいけると思う。
オシャレコーデ
WEAR
無印良品は間違いなく今後くる〜
昔から無印は好きだったのですが、2つ気にくわないところがありました
- 種類がが少なすぎる。
- 高い
例えばTシャツならUネックしかないとかだったけど、ご覧の通り。これだけ種類があれば満足する方結構いると思う。
あとは値段だけど、この前各アイテム値下げを発表みたいな記事読んだのでもう少し安くなるかも。
こーなってくると、高いから無印良品は買わないって人多かったと思うけど値段が同じならば無印良品で買うって人は出てくると思う。
何となく無印良品の方が高いブランドイメージ付いてるし。多分…
ということで今日はここまで。
22歳でパパになって良かったと思うこと/思わないこと
こんちには。opiyoです。
昨日ですかね、私が尊敬している元リクルートで副業家の西村さんがNEW PEACE代表の高木新平さんの記事を見て書いたというブログを見ました。
内容は簡単に言うと「若くして家族を持つことも悪くないよ!」って話だとぼくは解釈しました。
ぼくも22歳で結婚。次の年には長男が生まれ、その次の年には長女が生まれました。
全く同じでは無いですが、とても近い状況な僕にとっては改めて「家族」について考えるきっかけになりました。
みんな違って、みんないい。
こんな言葉があったような気がしますが、こんな感じになりそうです。
良かったと思うこと
仕事の第一次ピークに全力になれる
仕事の第一次ピークは、33〜38歳にやってくる
子育てがひと段落した状態で「仕事の第一次ピーク」を迎えられる
高木さんの記事では、仕事の第一次ピークは、33〜38歳と書かれています。
僕は今27歳。8月で28歳になる。
つまり、仕事の第一次ピークを迎えるのは5年後、2022年頃には
- 長男・・・10歳(小4)
- 長女・・・9歳(小3)
僕が30歳になる2年後であっても長男は小1、長女は年長になるので、この頃にはほとんど手はかからなくなりそうです。
これは、良い点ですね。いざという時に全力で走れます。
一番体力がある時に子育てができる
仕事の先輩、幼稚園パパを見るとやっぱり僕の優位は明らかです。
偉そうなこと言ってごめんなさい。でも、これだけは自信をもって子供たちに誇れるポイントです。
僕自身が3人目として生まれたので周りに比べると僕の両親はジジババでした。
なので公園行って走り回った記憶も無いです。唯一の楽しみはキャッチボールでした。
だから若い!ってのはそれだけで子どもと一緒に遊ぶ体力があるので良い事ばかりです。
コミュニティができる
子どもがいると幼稚園、習いごとなど絶対に繋がらないであろう人達と交流ができるってのは間違いなく良い所だと思います。
良くないなと思ったこと
20代という一番楽しい時間を自分だけに使う事ができない
もーこれです。 羨ましいに決まってるじゃないですか。何を強がっているのか。
僕が結婚した前後くらいから皆がiphone持つようになって今みたいな何処とでも繋がっている素晴らしい世界になってきました。そんな状況にも関わらず家と会社を往復する日々。自分に使う時間ってよりかはお金が無いので何も出来ない。そんな状況です。
旅したい。カメラ欲しい。遊びたい。
残念ながら今はできません。
周りの方が経済的に豊か
当たり前ですが皆さん僕より年上です。一回りも違う人だっています。ですから当たり前のように家があるから遊びに行って帰ってくると子どもは「なぜうちは階段が無いのか」聞いてくる。これは結構きついですよ。
待ってろよ。絶対どうにかしてやるからな。
みんな違って、みんな良い
よかったこと、よくないなと思ったこと自分なりに整理してきました。
結局ぼくは何が言いたいのだろうか。正直良く分かりません。
だけど、僕が歩んできた道に後悔はありません。家族には本当に感謝しています。
ありがとうね。
ということで「みんな違って、みんな良い」
あの人がこうだから…ではなくて、自分が良いと思える道をきちんと選んで生きていきましょう。
Ruby on Rails チュートリアルで30歳までに人生を変える(第3章)
こんちには、opiyoです。
人生の生き残りをかけて始めた「Railsブートキャンプ」ですが、今日はRailsチュートリアル第3章をやっていこうと思います。
railsチュートリアル 3章の流れ
静的なページのセットアップ
繰り返しの復習は大事です。人間はすぐに忘れてしまう動物なので。
改めてrails new
して最低限のところまでを作ります!
https://railstutorial.jp/chapters/static_pages?version=5.0#sec-sample_app_setup
$ rails _5.0.0.1_ new sample_app
- Gemfileをいじります
source 'https://rubygems.org' gem 'rails', '5.0.0.1' gem 'puma', '3.4.0' gem 'sass-rails', '5.0.6' gem 'uglifier', '3.0.0' gem 'coffee-rails', '4.2.1' gem 'jquery-rails', '4.1.1' gem 'turbolinks', '5.0.1' gem 'jbuilder', '2.4.1' group :development, :test do gem 'sqlite3', '1.3.11' gem 'byebug', '9.0.0', platform: :mri end group :development do gem 'web-console', '3.1.1' gem 'listen', '3.0.8' gem 'spring', '1.7.2' gem 'spring-watcher-listen', '2.0.0' end group :test do gem 'rails-controller-testing', '0.1.1' gem 'minitest-reporters', '1.1.9' gem 'guard', '2.13.0' gem 'guard-minitest', '2.4.4' end group :production do gem 'pg', '0.18.4' end # Windows環境ではtzinfo-dataというgemを含める必要があります gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
$ bundle install --without production
- エラーが出たら
$ bundle update
する
- エラーが出たら
git
を使ってsample_app
をバージョン管理下にする- トップページ(hogehoge.com/)に
hello world
を表示されるようにコードを修正する heroku
の設定を行いpush
しますheroku open
してhello world
が表示されればOK
git
とheroku
の設定はチュートリアルを見ずにやってみることで、覚えているかの復習になりますね!
コントローラーの作り方
- 表記はキャメルケース = 単語の先頭を大文字になる(StaticPages)
- アクション名は全て小文字にする
- 出来上がるコントローラーファイル名はスネークケース = 単語をアンダーバー
_
でつなぎ合わせた名前になる
$ rails g controller StaticPages home help # コントローラー名 アクション名ですね create app/controllers/static_pages_controller.rb # 出来上がったコントローラーのファイル route get 'static_pages/help' route get 'static_pages/home' invoke erb create app/views/static_pages create app/views/static_pages/home.html.erb create app/views/static_pages/help.html.erb invoke test_unit create test/controllers/static_pages_controller_test.rb invoke helper create app/helpers/static_pages_helper.rb invoke test_unit invoke assets invoke coffee create app/assets/javascripts/static_pages.coffee invoke scss create app/assets/stylesheets/static_pages.scss
- routes.rbが自動的に更新される
Rails.application.routes.draw do get 'static_pages/home' # 自動的に追加されたよ get 'static_pages/help' # 自動的に追加されたよ root 'application#hello' end
このgetは、/static_pages/home/
というURLでアクセスされたら、static_pages
コントローラーのhome
アクションと結びつく設定になります。
テスト駆動開発 (TDD)
考え方
テストの手法のひとつで、最初に「正しいコードがないと失敗するテスト」を書き、次に本編のコードを書いてそのテストがパスするようにする考え、やり方かな。
テストをするメリットはチュートリアルのコラムの中で書かれてますが、引用します。
さらに詳細までみたいな場合は、こちらからどうぞ(コラム3-3.です)
https://railstutorial.jp/chapters/static_pages?version=5.0#sec-custom_static_pages
当たり前ですが、何か問題があるとお客様に迷惑をかけます。それは本当に申し訳無いところなのですが、お客様以外のところで凄く面倒なことになります。
だからテストを書くのです。もーこれだけ。
テストコードの書き方
テストコードはrails g controller
を実行した時点で作成されます。
require 'test_helper' class StaticPagesControllerTest < ActionDispatch::IntegrationTest test "should get home" do get static_pages_home_url assert_response :success end end
これを日本語で表すと、「Homeページのテスト。GETリクエストをhomeアクションに対して発行 (=送信) せよ。そうすれば、リクエストに対するレスポンスは[成功]になるはず。」となります。
テストの実行方法は
$ rails test # Running: .. Finished in 1.467940s, 1.3625 runs/s, 1.3625 assertions/s. 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
0 errorsとなっているので、成功(GREEN)したことが分かりますね。
もしエラーになる場合は、こちらに回避方法書いたので参考にしてください。 opiyotan.hatenablog.com
このように、テストと一緒にコードを書いていくことが最近は推奨されています。
3.3.1では、TDDの考えに基づき失敗するエラーを書いて成功させリファクタリングするという流れでテストする方法が乗っていますので是非チャレンジしてみてください。
動的にタイトルを変更する
先ずは各ページのタイトルをチェックするテストを書きます。
もちろん、view
のtitle
タグは何も変更していないのでエラー(RED)になります。
require 'test_helper' class StaticPagesControllerTest < ActionDispatch::IntegrationTest test "should get home" do get static_pages_home_url assert_response :success assert_select "title", "Home | Ruby on Rails Tutorial Sample App" # ここ追加しました。"title"タグに書かれた文字列をチェックするテストです end end
では、次にview
のtitle
タグを修正していきます。始めにapp/views/static_pages/home.html.erb
ファイルから。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Home | Ruby on Rails Tutorial Sample App</title> # この部分ですね </head> <body> <h1>Sample App</h1> <p> This is the home page for the <a href="http://railstutorial.jp/">Ruby on Rails Tutorial</a> </p> </body> </html>
この状態でテストを実行するとhome
アクションについては修正したのでエラーじゃなくなりますが他の2つのアクションがエラーになります
$ rails test # Running: Failure: StaticPagesControllerTest#test_should_get_about [/Users/taku/rails/railstutorial/sample_app/test/controllers/static_pages_controller_test.rb:19]: <About | Ruby on Rails Tutorial Sample App> expected but was <SampleApp>.. Expected 0 to be >= 1. bin/rails test test/controllers/static_pages_controller_test.rb:16 Failure: StaticPagesControllerTest#test_should_get_help [/Users/taku/rails/railstutorial/sample_app/test/controllers/static_pages_controller_test.rb:13]: <Help | Ruby on Rails Tutorial Sample App> expected but was <SampleApp>.. Expected 0 to be >= 1. bin/rails test test/controllers/static_pages_controller_test.rb:10 Finished in 0.649278s, 4.6205 runs/s, 9.2410 assertions/s. 3 runs, 6 assertions, 2 failures, 0 errors, 0 skips
なので、エラー(RED)にならないようhelp
とabout
も修正し成功(GREEN)させます。
リファクタリング
今までは全てのview
ファイルに直接title
タグを書き込んでいました。なので当然表示されるタイトルも変わってきます。
これらを今テストでやったように共通にできるところは共通化し、違う部分だけを設定するように修正していきます。
このように同じコードを繰り返し書かないようにする考え方を「DRY(Don’t Repeat Yourself: 繰り返すべからず) 」と言います。
では早速やってみます。先ずは各ページに動的に変更する部分を書いていきます。
app/views/static_pages/home.html.erb
<% provide(:title, "Home") %> # 各ビュー毎に文字列をセットする <!DOCTYPE html> <html> <head> <title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title> # 設定した文字列をyield関数を使って反映させる </head> <body> <h1>Sample App</h1> <p> This is the home page for the <a href="http://railstutorial.jp/">Ruby on Rails Tutorial</a> sample application. </p> </body> </html>
次に共通のビューになるapplication.html.erb
のtitle
をyield
関数を使って表示されるようにします
<!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> <body> <%= yield %> # ここで各ページを読み込んでいるから、各ビューでは`head`タグとかがいらないんですね </body> </html>
それぞれのページでは違う処理だけ書く。共通部分はapplication.html.erb
で定義する!!
<% provide(:title, "Home") %> <h1>Sample App</h1> <p> This is the home page for the <a href="http://railstutorial.jp/">Ruby on Rails Tutorial</a> sample application. </p>
railsチュートリアル 3章の演習問題
3.1 演習
問題1
BitbucketがMarkdown記法のREADME (リスト 3.3) をHTMLとして正しく描画しているか、確認してみてください。
回答1
ぼくは、githubで作業しているのですが問題なく描画されていますね。
- h1は大きな文字
- h2は少し大きな文字
- リンクは青色で
- コード部分は灰色になる
https://github.com/nakanoTaku/railstutorial_3
問題2
本番環境 (Heroku) のルートURLにアクセスして、デプロイが成功したかどうか確かめてみてください。
回答2
hello worldが表示されているのでOKですね!
heroku logs
でログを見ることも出来ます。
3.2.1 演習
問題1
Fooというコントローラを生成し、その中にbarとbazアクションを追加してみてください。
回答1
$ rails g controller Foo bar baz class FooController < ApplicationController def bar end def baz end end
問題2
コラム 3.1で紹介したテクニックを駆使して、Fooコントローラとそれに関連するアクションを削除してみてください。
回答2
$ rails destroy controller Foo bar baz
3.4.2 演習
テストを一部リファクタリングします。
3つのアクションで同じように使われている文字列「Ruby on Rails Tutorial Sample App」を変数に代入し、使い回すようにします。
require 'test_helper' class StaticPagesControllerTest < ActionDispatch::IntegrationTest def setup @base_title = "Ruby on Rails Tutorial Sample App" # setupというテストが実行される前に処理されるメソッド内で文字列を変数にセットしておきます。 end test "should get home" do get static_pages_home_url assert_response :success assert_select "title", "Home | #{@base_title}" # 変数を参照するように修正します。 end end
3.4.4 演習
問題1
リスト 3.41にrootルーティングを追加したことで、root_urlというRailsヘルパーが使えるようになりました (以前、static_pages_home_urlが使えるようになったときと同じです)。リスト 3.42のFILL_INと記された部分を置き換えて、rootルーティングのテストを書いてみてください。
回答1
test "should get root" do get root_url assert_response :success end
問題2
実はリスト 3.41のコードを書いていたので、先ほどの課題のテストは既に green になっているはずです。このような場合、テストを変更する前から成功していたのか、変更した後に成功するようになったのか、判断が難しいです。リスト 3.41のコードがテスト結果に影響を与えていることを確認するため、リスト 3.43のようにrootルーティングをコメントアウトして見て、 red になるかどうか確かめてみましょう (なおRubyのコメント機能については4.2.1で説明します)。最後に、コメントアウトした箇所を元に戻し (すなわちリスト 3.41に戻し)、テストが green になることを確認してみましょう。
回答2
ちゃんとREDになるし、GREEMにもなる
railsチュートリアル 3章で学んだこと
テストをパワーアップする
minitest reporters
テストの成功(RED)失敗(GREEN)の見栄えをよくしてくれます。
準備するのはこれだけ、是非試してみてください!
# ファイル名:test/test_helper.rb ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' require "minitest/reporters" Minitest::Reporters.use! class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. fixtures :all # Add more helper methods to be used by all tests here... end
Guard
ファイルの変更を検出して必要なテストだけを自動実行してくれるそうです。
例えば、「home.html.erbファイルが変更されたらstatic_pages_controller_test.rbを自動的に実行する」といったことをGuardで設定することができます。
これヤバいですね。今はまだ変更するファイルも少ないですし何をしたか全部記憶できるくらいしかないですが絶対面倒になって忘れますよね。
詳細な設定方法はRailsチュートリアルを参照してください。
https://railstutorial.jp/chapters/static_pages?version=5.0#sec-guard
手順だけ簡単にまとめておきます。
- 初期化
$ bundle exec guard init
初期化を実行すると、「/Guardfile」が作成されます。
- Guardfileを編集する
- .gitignoreにSpringを追加する
- Guardの実行
$ bundle exec guard
なんか実行すると「Ctrl + D」か「テストが成功」するまで終わらないのだけど、これは正しい動きなのか?
ずっとバックグラウンドで動かしておいて、常に監視させておくってことなのかな...
あーすごい便利かなーと思ったけど、これは使わないかもしれない。邪魔っちー
httpメソッド
HTTP (HyperText Transfer Protocol) には4つの基本的な操作があり、それぞれGET、POST、PATCH、DELETEという4つの動詞に対応づけられています。クライアント (例えばFirefoxやSafariなどのWebブラウザ) とサーバー (ApacheやNginxなどのWebサーバー) は、上で述べた4つの基本操作を互いに認識できるようになっています
- get
主にWeb上のデータを読み取る (get) ときに使われるリクエストです。
- post
ページ上のフォームに入力した値を、ブラウザから送信する時に送られるリクエストです。
gitでaddとcommitを一回でやる!
$ git commit -am "Improve the README"
herokuへpushした時に何かエラー
$ heroku logs
新しいブランチの作り方
$ git checkout -b hogehoge
今チェックアウトしているブランチは?
$ git branch master * static-pages
ブランチを指定してpushするには?
$ git push origin hogehoge
rails g をやり直したい!
$ rails destroy controller StaticPages home help $ rails destroy model User
Unixプロセスの確認
$ ps aux $ ps aux | grep spring $ ps aux | grep spring taku 7781 0.0 0.2 2518224 19900 ?? S 5:23PM 0:00.42 spring server | sample_app | started 31 mins ago taku 8561 0.0 0.0 2423376 216 s003 R+ 5:55PM 0:00.00 grep spring taku 7782 0.0 0.9 2577420 73224 ?? Ss 5:23PM 0:02.75 spring app | sample_app | started 31 mins ago | test mode $ spring stop $ ps aux | grep spring taku 8604 0.0 0.0 2434840 804 s003 S+ 5:57PM 0:00.00 grep spring # 「7781」「7782」が無くなった!
railsチュートリアル 3章のまとめ
3章ではテスト駆動開発 (TDD)に沿って、開発を進めてきました。 簡単にまとめるこんな感じでしょうか?
- 何事も繰り返し行うことで覚えることができる
rails new
git init
~git push
までの流れ
rails g controller ControllerName アクション名
でコントローラーが作れる- RailsのビューはRubyのコードが使える
- テスト駆動開発 (TDD)は、「RED」「GREEN」「REFACTOR」のサイクルを繰り返して開発をすることだ
では、最後にぼくが一番尊敬している先輩エンジニアからの名言でお別れしましょー
テストコードが仕様書だ
Ruby on Railsチュートリアル3章の「3.3.1 最初のテスト」のエラーを解消!
こんちには、opiyoです。
Railsチュートリアルの第3章に取り組んでいる最中ですが、ハマリポイントがあったので共有したいと思います。
https://railstutorial.jp/chapters/static_pages?version=5.0#sec-our_first_test
エラーの内容
$ rails test # Running: .. Finished in 0.633771s, 3.1557 runs/s, 3.1557 assertions/s. /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/test_unit/minitest_plugin.rb:9:in `aggregated_results': wrong number of arguments (given 1, expected 0) (ArgumentError) from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/minitest-5.10.2/lib/minitest.rb:597:in `report' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/minitest-reporters-1.1.9/lib/minitest/minitest_reporter_plugin.rb:26:in `each' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/minitest-reporters-1.1.9/lib/minitest/minitest_reporter_plugin.rb:26:in `report' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/minitest-5.10.2/lib/minitest.rb:687:in `each' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/minitest-5.10.2/lib/minitest.rb:687:in `report' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/minitest-5.10.2/lib/minitest.rb:141:in `run' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/test.rb:9:in `<top (required)>' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `block in require' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:138:in `require_command!' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:95:in `test' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands.rb:18:in `<top (required)>' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `block in require' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require' from /Users/taku/rails/railstutorial/sample_app/bin/rails:9:in `<top (required)>' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `block in load' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from -e:1:in `<main>'
原因
どうやらgemのminitestが5.10.2(2017/5/9リリース)にアップデートされたことで発生したらしいです。
解決方法
1. gemのminitestを追加します。
group :test do gem 'rails-controller-testing', '0.1.1' gem 'minitest-reporters', '1.1.9' gem 'guard', '2.13.0' gem 'guard-minitest', '2.4.4' gem 'minitest', '~> 5.10', '!= 5.10.2' # これですね 多分5.10.2以外のバージョンでマイナーバージョンへアップデートかな? end
2. bundle update
してgemを更新します。
$ bundle update Resolving dependencies... Using rake 12.0.0 Using concurrent-ruby 1.0.5 Using i18n 0.8.4 Using minitest 5.10.1 (was 5.10.2) . . Bundle updated! Gems in the group production were not installed.
3. rails test
を再実行する
$ rails test Run options: --seed 57994 # Running: .. Finished in 0.648009s, 3.0864 runs/s, 3.0864 assertions/s. 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
めでたし、めでたし
Ruby on Railsアプリケーションを5分でHerokuにデプロイする
こんちにわ、opiyoです。
今日は、Railsチュートリアルに出てくるアプリケーションをHerokuへ反映するまでの手順をまとめてみました。
とても簡単なので、是非やってみて下さい。
GemfileにPostgreSQL設定
group :production do gem 'pg', '0.17.1' gem 'rails_12factor', '0.0.2' end
設定したら bundle install
する
Herokuのユーザ登録
Heroku Toolbeltインストール
インストールできたらHerokuをコマンドラインから操るためのプラプインをインストールする
$ heroku version heroku-cli: Installing Toolbelt v4... done For more information on Toolbelt v4: https://github.com/heroku/heroku-cli heroku-cli: Adding dependencies... done heroku-cli: Installing core plugins... done heroku-toolbelt/3.42.42 (x86_64-darwin10.8.0) ruby/1.9.3 heroku-cli/4.27.26-693efcb (amd64-darwin) go1.6 === Installed Plugins heroku-apps@1.2.7 heroku-cli-addons@0.2.1 heroku-fork@4.1.1 heroku-git@2.4.5 heroku-local@4.1.7 heroku-orgs@1.0.4 heroku-pipelines@1.1.1 heroku-run@2.9.2 heroku-spaces@2.0.14 heroku-status@2.1.0
Herokuにログイン
アドレスとパスワードを聞かれるので、入力してエンター
$ heroku login Enter your Heroku credentials. Email: XXXXXXXXXXXX@gmail.com Password (typing will be hidden): Logged in as XXXXXXXXXXXX@gmail.com
sshキー登録
僕の場合は二つ.pubファイルがあったからかな。 どっち?って聞かれたので「2」を入力してエンターしたら出来た
$ heroku keys:add Found the following SSH public keys: 1) XXXX.pub 2) XXXX2.pub Which would you like to use with your Heroku account? 2 Uploading SSH public key /Users/hogehoge/.ssh/XXXX2.pub... done
Herokuにアプリケーション作成
.....herokuapp.comってのがドメイン名になるんだね
$ heroku create Creating app... done, stack is cedar-14 https://tranquil-depths-10745.herokuapp.com/ | https://git.heroku.com/tranquil-depths-10745.git
Herokuにデプロイしまーす
$ git push heroku master Counting objects: 73, done. Delta compression using up to 8 threads. Compressing objects: 100% (61/61), done. Writing objects: 100% (73/73), 16.60 KiB | 0 bytes/s, done. Total 73 (delta 7), reused 0 (delta 0) remote: Compressing source files... done. ` ` ` ` remote: Verifying deploy.... done. To https://git.heroku.com/tranquil-depths-10745.git
で、ここまで来たら $ heroku open
ってするとブラウザからアプリが見れちゃいます。
きっとここまで5分かかってないです。 細かいところまで分かるようになりたいですが、こんなに簡単に公開できるってことが分かったのは勉強になりますね。
Ruby on Rails チュートリアル2章まとめ(演習も)
こんちには、opiyoです。
人生の生き残りをかけて始めた「Railsブートキャンプ」ですが、今日はRailsチュートリアル第2章をやっていこうと思います。
第1章をまとめたのはこちらからどうぞ。
railsチュートリアル2章の進め方
モデル(Model)の作成
ユーザーモデル
テーブル:users
カラム:id:integer, name:string, email:string
マイクロポストモデル
テーブル:microposts
カラム:id:integer, content:text, user_id:integer
user_idを使って、1人のユーザーに対して複数のマイクロポストが関連付けるという構図になる。
テーブル名は複数形になるので注意!
scaffold
作成、一覧、編集、削除ができる機能を簡単に作ってくれる
$ rails g scaffold User name:string email:string # テーブル名は単数系だからね! Expected string default value for '--jbuilder'; got true (boolean) invoke active_record create db/migrate/20170614093157_create_users.rb create app/models/user.rb invoke test_unit create test/models/user_test.rb create test/fixtures/users.yml invoke resource_route route resources :users invoke scaffold_controller create app/controllers/users_controller.rb invoke erb create app/views/users create app/views/users/index.html.erb create app/views/users/edit.html.erb create app/views/users/show.html.erb create app/views/users/new.html.erb create app/views/users/_form.html.erb invoke test_unit create test/controllers/users_controller_test.rb invoke helper create app/helpers/users_helper.rb invoke test_unit invoke jbuilder create app/views/users/index.json.jbuilder create app/views/users/show.json.jbuilder invoke assets invoke coffee create app/assets/javascripts/users.coffee invoke scss create app/assets/stylesheets/users.scss invoke scss create app/assets/stylesheets/scaffolds.scss
migrate
データベースを更新し、usersデータモデルを作成します。
db/migrate
ディレクトリにあるファイルを見て何をするか判断している。
$ rails db:migrate == 20170614093157 CreateUsers: migrating ====================================== -- create_table(:users) -> 0.0019s == 20170614093157 CreateUsers: migrated (0.0022s) =============================
name
とemail
を持った、users
テーブルを作るってことが分かりますね。
class CreateUsers < ActiveRecord::Migration[5.0] def change create_table :users do |t| t.string :name t.string :email t.timestamps end end end
railsチュートリアル2章の演習問題
2.2.1 演習
問題1
CSSを知っている読者へ: 新しいユーザーを作成し、ブラウザのHTMLインスペクター機能を使って「User was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?
回答1場所は、bodyタグ直下にあってこんな感じ
<p id="notice">User was successfully created.</p>
リロードすると、pタグは残るが中身のメッセージが非表示になる
<p id="notice"></p>
問題2
emailを入力せず、名前だけを入力しようとした場合、どうなるでしょうか?
回答2
名前のみ登録される
問題3
「@example.com」のような間違ったメールアドレスを入力して更新しようとした場合、どうなるでしょうか?
回答3
問題なく登録される
問題4
上記の演習で作成したユーザーを削除してみてください。ユーザーを削除したとき、Railsはどんなメッセージを表示するでしょうか?
回答4
User was successfully destroyed.
を表示する。
2.2.2 演習
問題1
図 2.11を参考にしながら、/users/1/edit というURLにアクセスしたときの振る舞いについて図を書いてみてください。
回答1
routes → コントローラーのeditアクション → モデル問い合わせなし → edit.html生成 → コントローラーがhtml受け取り → ブラウザへ返す
問題2
図示した振る舞いを見ながら、Scaffoldで生成されたコードの中でデータベースからユーザー情報を取得しているコードを探してみてください。
回答2
@users = User.all
問題3
ユーザーの情報を編集するページのファイル名は何でしょうか?
edit.html.erb
2.3.1 演習
問題1
CSSを知っている読者へ: 新しいマイクロポストを作成し、ブラウザのHTMLインスペクター機能を使って「Micropost was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?
回答1
2.2.1 演習
とほとんど同じ。
問題2
マイクロポストの作成画面で、ContentもUserも空にして作成しようとするどうなるでしょうか?
回答2
問題なく登録できる。
問題3
141文字以上の文字列をContentに入力した状態で、マイクロポストを作成しようとするとどうなるでしょうか? (ヒント: WikipediaのRubyの記事にある1段落目がちょうど150文字程度ですが、どうなりますか?)
回答3
問題なく登録できる
問題4
上記の演習で作成したマイクロポストを削除してみましょう。
回答4
問題なく削除できる。
2.3.2演習
問題1
先ほど2.3.1.1の演習でやったように、もう一度Contentに141文字以上を入力してみましょう。どのように振る舞いが変わったでしょうか?
回答1
Content is too long (maximum is 140 characters)
というエラーメッセージが表示される
問題2
CSSを知っている読者へ: ブラウザのHTMLインスペクター機能を使って、表示されたエラーメッセージを調べてみてください。
回答2
画面上部にエラーメッセージが表示される
<div id="error_explanation"> <h2>1 error prohibited this micropost from being saved:</h2> <ul> <li>Content is too long (maximum is 140 characters)</li> </ul> </div>
Content
の入力欄が赤枠になる
<div class="field"> <div class="field_with_errors"><label for="micropost_content">Content</label></div> <div class="field_with_errors"><textarea name="micropost[content]" id="micropost_content">12345678901234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 </textarea></div> </div>
2.3.3 演習
問題1
ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。同ファイル内の他のコードから文法を推測してみてください (コラム 1.1で紹介した技術の出番です)。うまく表示できたかどうか、/users/1 にアクセスして確認してみましょう。
回答1
users/show.html.erb
に追加
<p> <strong>Content:</strong> <%= @user.microposts.first.content %> </p>
問題2
リスト 2.16は、マイクロポストのContentが存在しているかどうかを検証するバリデーションです。マイクロポストが空でないことを検証できているかどうか、実際に試してみましょう (図 2.16のようになっていると成功です)。
回答2
app/models/micropost.rb
を修正
class Micropost < ApplicationRecord belongs_to :user validates :content, length: { maximum: 140 }, presence: true end
問題3
リスト 2.17のFILL_INとなっている箇所を書き換えて、Userモデルのnameとemailが存在していることを検証してみてください (図 2.17)。
回答3
app/models/user.rb
を修正
class User < ApplicationRecord has_many :microposts validates :name, presence: true validates :email, presence: true end
2.3.4 演習
問題1
Applicationコントローラのファイルを開き、ApplicationControllerがActionController::Baseを継承している部分のコードを探してみてください。
回答1
class ApplicationController < ActionController::Base
問題2
ApplicationRecordがActiveRecord::Baseを継承しているコードはどこにあるでしょうか? 先ほどの演習を参考に、探してみてください。ヒント: コントローラと本質的には同じ仕組みなので、app/modelsディレクトリ内にあるファイルを調べてみると...?)
回答2
app/models/application_record.rb
のclass ApplicationRecord < ActiveRecord::Base
railsチュートリアル2章で学んだこと
MVC(Model-View-Controller)の動き
「/users にあるindexページをブラウザで開く」という操作を行った時、どのように内部では処理が動くのか。
これは、Railsチュートリアルの方を見てください。図もあり説明もありなので分かりやすいです。
https://railstutorial.jp/chapters/toy_app?version=5.0#sec-mvc_in_action
入力チェック(バリデーション)
モデルのファイルmicropost.rb
で最大140文字までの入力チェックを付ける
class Micropost < ApplicationRecord validates :content, length: { maximum: 140 } end
必須入力を付ける場合はpresence: true
を付ける
class Micropost < ApplicationRecord validates :content, length: { maximum: 140 }, presence: true end
1対nの関連付け
https://railstutorial.jp/chapters/toy_app?version=5.0#sec-demo_user_has_many_microposts
簡単に書くと
- 1の方に
has_many
を書いて、nを複数形で指定する - nの方に
belongs_to
を書いて、1を単数系で指定する
Railsコンソール
データベースへアクセスし色々できる
$ rails c exit # 終了
継承について
https://railstutorial.jp/chapters/toy_app?version=5.0#sec-inheritance_hierarchies
- モデルクラスの場合は、
ApplicationRecord
→ActiveRecord::Base
を継承している - データベースに接続する処理やデータベースを扱える処理は
ActiveRecord::Base
側で定義されている - これによって、新しく作ったクラスでデータベースに接続する処理やデータベースを扱える処理を書かなくて色々できる
- モデルだけじゃなくコントローラーも同じようになっている
- コントローラーの場合は
ApplicationController
を継承している
herokuへのデプロイ
手順は1章と同じですが、今回はDBを新たに作ったのでマイグレーションをする必要があります
$ git add . $ git commit -m "終わりー" $ git push origin master $ git push heroku $ heroku run rails db:migrate $ heroku open
違えて実行したscaffoldを無かったことにする
間違えてscaffold
しちゃった時は削除できる
$ rails destroy scaffold Micropost Running via Spring preloader in process 4158 Expected string default value for '--jbuilder'; got true (boolean) invoke active_record remove db/migrate/20170614102406_create_microposts.rb remove app/models/micropost.rb invoke test_unit remove test/models/micropost_test.rb remove test/fixtures/microposts.yml invoke resource_route route resources :microposts invoke scaffold_controller remove app/controllers/microposts_controller.rb invoke erb remove app/views/microposts remove app/views/microposts/index.html.erb remove app/views/microposts/edit.html.erb remove app/views/microposts/show.html.erb remove app/views/microposts/new.html.erb remove app/views/microposts/_form.html.erb invoke test_unit remove test/controllers/microposts_controller_test.rb invoke helper remove app/helpers/microposts_helper.rb invoke test_unit invoke jbuilder remove app/views/microposts remove app/views/microposts/index.json.jbuilder remove app/views/microposts/show.json.jbuilder invoke assets invoke coffee remove app/assets/javascripts/microposts.coffee invoke scss remove app/assets/stylesheets/microposts.scss invoke scss
新しく綺麗な状態のDBを作りたいとき
DB削除 → DB作成 → migrationを一発でやってくれる
$ rails db:migrate:reset Dropped database 'db/development.sqlite3' Database 'db/test.sqlite3' does not exist Created database 'db/development.sqlite3' Created database 'db/test.sqlite3' == 20170614093157 CreateUsers: migrating ====================================== -- create_table(:users) -> 0.0021s == 20170614093157 CreateUsers: migrated (0.0023s) ============================= == 20170614102713 CreateMicroposts: migrating ================================= -- create_table(:microposts) -> 0.0008s == 20170614102713 CreateMicroposts: migrated (0.0009s) ========================
railsチュートリアル3章はこちら
瀧見サキが作る"痛くないハイヒール"はママこそオススメ!
こんにちは、@opiyoです。
ハイヒールを履いた女性は好きですか?
今日は、瀧見サキさんが作るハイヒールについて調べてみました。
瀧見サキさんはママ。
そんな子育て真っ最中のママが作る靴は「エレガントなデザイン」で「芝生の上を歩くような履き心地」というコンセプトで作る「痛くないハイヒール」
これはもーママ達が忘れかけていたオシャレを取り戻す最高の靴なのでは無いでしょうか?
ハイヒールは嫌われ者?
そもそもだけど、ハイヒールってそんなに痛いのかとおもってネット(ガルちゃん)で色々調べてみたのですが、ハイヒールはやはり物凄く「痛い」そうです。
- 産後ぺたんこしか履いてないから ヒール苦手ってより履くのが怖い‼︎ 3年前まではヒールしか履かなかったのに…。 ペタンコは楽だけどなんだかんだ 足が疲れる(。-_-。)
- 見た目のために苦痛を我慢するのは20代で終わりにしました。 一日履いてもぜーんぜん痛くならないハイヒールはありませんか?
- ヒール自体はかわいいと思うしスタイルもよく見えるから好きですけど、歩く距離や一緒に出かける人のこと考えると結局低めの靴になります 長くヒール履けるコツってないんですかね
- 足が薄いらしく、どうしても前にすべって指が痛くなるので苦手です! 履きたいんですけど痛いし疲れる;
- ヒールはスタイルよく見せる重要アイテムなので、無理して履いてます(._.)女って大変(つД`)ノ
http://girlschannel.net/topics/169306/ から引用
確かに妻もハイヒールは我慢して履いてるって昔言ってましたね。
なんかでも色々見てると
- ハイヒールは可愛い
- スタイル良く見えるから履きたい
- カッコイイ
なんて意見も多いですね。
SAKIAS(サキアス)
まーとにかく見てください。写真を上回る説明をできる自信がありません。本当に素敵です。
どこで買える?
- 伊勢丹新宿店 リ・スタイル
- 住所:東京都新宿区新宿 3-14-1 本館3F
- 電話番号:03-3352-1111
- STUDIOUS JINNAN
- 住所:東京都渋谷区神南 1-5-19 1.2F
- 電話番号:03-6277-5582
- STUDIOUS CITY NEWoMan 新宿店
- 住所:東京都新宿区新宿 4-1-6 NEWoMan M2F
- 電話番号:03-5315-4333
- CITYSHOP
- 住所:東京都港区南青山 5-4-41 2F
- 電話番号:03-5778-3912
- Altamira
- 住所:愛知県名古屋市中区栄 3-35-15
- 電話番号:052-251-5488
- LOVE
- 住所:愛知県岡崎市明大寺本町 1-34 岡崎センタービル1A
- 電話番号:0564-83-5969
- AFTER SCHOOL
- 住所:新潟県新潟市中央区西堀通 5-833-8 3F
- 電話番号:025-378-0405
オンラインはこちら
LOVE online store|WOMEN | SAKIAS 商品一覧ページ
伊勢丹、STUDIOUS、ZOZOTOWNは検索にヒットしなかった。
まとめ
いかがでしたでしょうか。
今日(6/14)たまたま付けた「セブンルール」という番組で瀧見サキさんを知りましたが、本当に見て良かったです。
子どもがいると座ったり立ったり、抱っこしたり、追いかけ回したり?(これはうちだけかな…)するのでハイヒールは中々履きずらかったりすると思いますが、そんな経験もしているママが作っている靴だからこそ他とは違う魅力があると思うのです。
テレビの中でも子どもが生まれた年は「手を使わずに履ける靴」を作ったと言っていたので、ママの日常が靴にも反映されている靴です。
- ハイヒールの最大の敵「痛み」が無い靴
- 子育て真っ最中のママが作った靴
もー買わない理由は無いですね。買ってください。
ぼくはホームページにトップページに使われているローファーが欲しいです。メンズは無いのかな?
どうしてもハイヒールに抵抗がある場合は、ハイヒールじゃ無い靴もあるみたいなので一度調べてみると良いかもしれませんね。
Ruby on Rails チュートリアル1章まとめ(演習も)
こんちにわ、opiyoです。
突然ですが、私は今日からプログラミングの勉強をスタートしようと思います。
その名も
Railsブートキャンプ
うん。そのまま!
基礎部分をRailsチュートリアルで行い、最終的に一つアウトプットできるwebサービスを作ることが目標です。
経験上、だらだらやっていると間延びしちゃうので一気に駆け抜けます!
第2章は、こちらからどうぞー
railsチュートリアルの開発環境
cloud9が良いのだろうが、面倒なのでローカルでやる。
cloud9でのやり方は、こちらで。
https://railstutorial.jp/chapters/beginning?version=5.0#sec-development_environment
railsをインストール
$ gem install rails -v 5.0.0.1 $ rails _5.0.0.1_ new hello_app create create README.md create vendor/assets/stylesheets/.keep remove config/initializers/cors.rb run bundle install Bundle complete! 15 Gemfile dependencies, 62 gems now installed. Use `bundle show [gemname]` to see where a bundled gem is installed. run bundle exec spring binstub --all * bin/rake: spring inserted * bin/rails: spring inserted
Gemfileの書き方
- gem 'sqlite3'
特定のバージョンを指定しない場合は、最新のバージョンを取得する
- gem 'uglifier', '>= 1.3.0'
ugliflerが1.3.0以上であれば最新バージョンがインストールされます メジャーバージョンアップになる
- gem 'coffee-rails', '~> 4.0.0'
4.0.4より大きく、4.1より小さい場合にインストールされる マイナーバージョンアップになる(4.0.1, 4.0.2, ...) 4.1, 4.2にはならない
railsサーバーの動かし方
$ rails s
Railsチュートリアルの演習問題
1.3.2演習
<問題1>デフォルトのRailsページに表示されているものと比べて、今の自分のコンピュータにあるRubyのバージョンはいくつになっていますか? コマンドラインでruby -vを実行することで簡単に確認できます。
<回答1>
$ ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin15]
<問題2>同様にして、Railsのバージョンも調べてみましょう。調べたバージョンはリスト 1.1でインストールしたバージョンと一致しているでしょうか?
<回答2>
$ rails -v Rails 5.0.0.1
1.3.4演習
<問題1>リスト 1.8のhelloアクションを書き換え、「hello, world!」の代わりに「hola, mundo!」と表示されるようにしてみましょう。
<回答1> application_controller.rbのrender html: "XX"を修正する
<問題2>Railsでは「非ASCII文字」もサポートされています。「¡Hola, mundo!」にはスペイン語特有の逆さ感嘆符「¡」が含まれています (図 1.13)17。「¡」文字をMacで表示するには、Optionキーを押しながら1キーを押します。この文字をコピーして自分のエディタに貼り付ける方が早いかもしれません。
<回答2>¡™£¢∞§¶•ªºœ∑´®†¥¨øåß∂ƒ©˙∆˚¬Ω≈ç√∫˜µ≤≥/ªº–≠π“‘/
<問題3>リスト 1.8のhelloアクションを参考にして、2つ目のアクションgoodbyeを追加しましょう。このアクションは、「goodbye, world!」というテキストを表示します。リスト 1.10のルーティングを編集して、ルートルーティングの割り当て先をhelloアクションからgoodbyeアクションに変更します (図 1.14)。
<回答3>
class ApplicationController < ActionController::Base protect_from_forgery with: :exception def hello render html: "¡Hola, mundo!" end def googbye render html: "goodbye, world!" end end Rails.application.routes.draw do root 'application#googbye' end
gitによるバージョン管理
プロジェクトのコードの履歴を追ったり、うっかり削除してしまったファイルを復旧 (ロールバック) したりという作業が行えるようになります。バージョン管理システムを熟知することは、今ではあらゆるソフトウェア開発者にとって必須のスキル
無料で読める書籍 https://git-scm.com/book/ja/v2
gitをなぜ使うのか?
https://railstutorial.jp/chapters/beginning?version=5.0#sec-what_good_does_git_do_you
git管理下にあれば、例え削除したとしても簡単に復活させることが可能です。
gitのコマンド
- git config
ユーザー名とメールアドレスを設定します。 これらは今後インターネット上に公開されることになりますので、ご注意ください。
- git init
- git status
- git add .
- git commit -m "コメント"
- git log
- git checkout -b modify-README
- git merge modify-README
- git branch -d
- git push
GitHubとBitbucket
gitを扱うための2つの著名なサービスです。 どちらも無料で使えますが、個人で使う分にはそれぞれ特徴があるので気をつけましょう! github 無料の場合は全てpublicになる つまり誰でも見ることができる bitbucket 無料でprivateになる
なので、無難なのはbitbucketでしょうか。 私も昔やったことがあるのですが、知らぬ知らぬ間に大事なkeyとかがコードに書いてて公開してしまうと非常に良くないですよね。 なので、閉じた環境であるbitbuckeの方がそういった心配をしなくて良いので安心です。
しかし本チュートリアルではWebアプリケーションの様々なコードを扱うため、全てのリポジトリがデフォルトで非公開になっている方がセキュリティ上安心して取り組めます。具体的には、本チュートリアルの後半で扱うコードには、暗号化キーやパスワードなどの機密情報が含まれます。このような情報を利用されると、サイトのセキュリティが脅かされるかもしれません。
Herokuにデプロイする
Railsを含むRuby Webアプリ用のホスティングプラットフォームです。Herokuは、ソースコードのバージョン管理にGitを使用していれば、Railsアプリケーションを簡単に本番環境にデプロイできます レンタルサーバーのすごいやつ。osとかdbとかをインターネット越しに扱えて簡単に使うことができる。 http://www.sejuku.net/blog/7858
セットアップは以前まとめた以下を参照 opiyotan.hatenablog.com
Herokuコマンド
- heroku rename rails-tutorial-hello
1.5.4演習
<問題1> heroku helpコマンドを実行し、Herokuコマンドの一覧を表示してみてください。Herokuアプリのログを表示するコマンドはどれですか?
<回答1>
Usage: heroku COMMAND [--app APP] [command-specific-options] Help topics, type "heroku help TOPIC" for more details: heroku access # manage user access to apps heroku addons # manage add-ons heroku apps # manage apps heroku authorizations # OAuth authorizations heroku buildpacks # manage the buildpacks for an app heroku certs # a topic for the ssl plugin heroku ci # run an application test suite on Heroku heroku clients # OAuth clients on the platform heroku config # manage app config vars heroku domains # manage the domains for an app heroku drains # list all log drains heroku features # manage optional features heroku git # manage local git repository for app heroku keys # manage ssh keys heroku labs # experimental features heroku local # run heroku app locally heroku logs # display recent log output heroku maintenance # manage maintenance mode for an app heroku members # manage organization members heroku notifications # display notifications heroku orgs # manage organizations heroku pg # manage postgresql databases heroku pipelines # manage collections of apps in pipelines heroku plugins # manage plugins heroku ps # manage dynos (dynos, workers) heroku redis # manage heroku redis instances heroku regions # list available regions heroku releases # manage app releases heroku run # run a one-off process inside a Heroku dyno heroku sessions # OAuth sessions heroku spaces # manage heroku private spaces heroku status # status of the Heroku platform heroku teams # manage teams heroku update # update heroku-cli
<問題2> 同じく、アプリの状態を調べるためのコマンドはどれですか? 直近に発生したイベントは何でしたか? (ちなみにこのログを調べるコマンドは、本番環境をデバッグするのに便利です)
<回答2>
- heroku ps
- heroku status
- heroku logs
このあたりかなー?
難しかったところ
1.3.1でGemfileを1.5に修正するが、bundle install
するとエラーになる
Resolving dependencies... Bundler could not find compatible versions for gem "actionpack": In snapshot (Gemfile.lock): actionpack (= 5.0.3) In Gemfile: rails (= 5.0.0.1) was resolved to 5.0.0.1, which depends on actionpack (= 5.0.0.1) rails (= 5.0.0.1) was resolved to 5.0.0.1, which depends on actionpack (= 5.0.0.1) rails (= 5.0.0.1) was resolved to 5.0.0.1, which depends on actionpack (= 5.0.0.1) rails (= 5.0.0.1) was resolved to 5.0.0.1, which depends on sprockets-rails (>= 2.0.0) was resolved to 3.2.0, which depends on actionpack (>= 4.0) Running `bundle update` will rebuild your snapshot from scratch, using only the gems in your Gemfile, which may resolve the conflict.
だから、bundle update
しよう
気になったところ
- githubとbitbucket両方でソース管理することは可能か?
$ git remote -v heroku https://git.heroku.com/opiyo.git (fetch) heroku https://git.heroku.com/opiyo.git (push) origin git@github.com:opiyo/railstutorial.git (fetch) origin git@github.com:opiyo/railstutorial.git (push)
この例では、heroku
とorigin(github)
だけどこのようにremote add
してやれば共存は可能。
コマンド打つ時も先頭の文字列を変えてやればOKだ。
$ git push origin master $ git push heroku master
- mergeした内容がpushされているかどうか確認する方法は?
git diff ローカル リモート
コマンドでローカルブランチとリモートブランチを比較すれば確認できる!
$ git diff master origin/master # これね! diff --git a/Gemfile b/Gemfile index 4816f4f..63b826d 100644 --- a/Gemfile +++ b/Gemfile @@ -21,9 +21,5 @@ group :development do gem 'spring-watcher-listen', '2.0.0' end -group :production do - gem 'pg', '0.18.4' -end - # Windows環境ではtzinfo-dataというgemを含める必要があります gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/Gemfile.lock b/Gemfile.lock index 79ef8a6..5c7b646 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -80,7 +80,6 @@ GEM nio4r (1.2.1) nokogiri (1.8.0) mini_portile2 (~> 2.2.0) - pg (0.18.4) puma (3.4.0) rack (2.0.3) rack-test (0.6.3) @@ -158,7 +157,6 @@ DEPENDENCIES jbuilder (= 2.4.1) jquery-rails (= 4.1.1) listen (= 3.0.8) - pg (= 0.18.4) puma (= 3.4.0) rails (= 5.0.0.1) sass-rails (= 5.0.6)
その他の学んだところ
Model-View-Controller(MVC)
ブラウザは一般的にWebサーバーにリクエスト (request) を送信し、これはリクエストを処理する役割を担っているRailsのコントローラ (controller) に渡されます。 コントローラは、場合によってはすぐにビュー (view) を生成してHTMLをブラウザに送り返します。 動的なサイトでは、一般にコントローラは (ユーザーなどの) サイトの要素を表しており、データベースとの通信を担当しているRubyのオブジェクトであるモデル (model) と対話します。 モデルを呼び出した後、コントローラは、ビューを描画し、完成したWebページをHTMLとしてブラウザに返します。
https://railstutorial.jp/chapters/images/figures/mvc_schematic.png
bundle installする時のオプション
$ bundle install --without production
本番用のgem (この場合はpg gem) をローカルの環境にはインストールしないようにするために、bundle installに特殊なフラグ「--without production」を追加します。
Herokuでは、サブドメインの他に独自ドメインも使用できます。実を言うと、このRuby on RailsチュートリアルもHeroku上に置かれているのです
何か不備、不足があればご指摘ください。