インターン 1日目(1月29日)

1,アプリケーションを作成
`rails new lovegraph`
(1-1 githubにも最初のコミットをする。参考：[github入門](https://qiita.com/nnahito/items/565f8755e70c51532459))
2,必要なページの書き出し、コントローラーの作成
top: トップページ
about: ラブグラフとは
flow: 撮影の流れ料金
photos: フォト一覧
staffs: カメラマン一覧
login: ログイン・登録
apply(~~request~~): 申し込み
`rails g controller pages top about flow photos staffs login request`

[コントローラーについて参考1](http://ruby-rails.hatenadiary.com/entry/20140802/1406948695)
[コントローラーについて参考2](https://github.com/rawhide/styleguide/blob/master/rails-style-guide.md#section-2-2)
(モデルを使うからHomesの複数形のコントローラーにした)

## エラー
![スクリーンショット 0030-01-29 午前10.51.11.png](https://qiita-image-store.s3.amazonaws.com/0/228601/66575a83-60fb-88e7-f477-5635759c1078.png)

仕方ないからエラーを読み解く
[エラーの読み方の勉強1](https://qiita.com/scivola/items/3017068a354892b239f4)
[エラーの読み方の勉強2](https://qiita.com/scivola/items/77017693de371ab49667)

NoMethodError
定義されていないメソッドの呼び出し
PagesController#topに定義されていないメソッドの呼び出しはあるか？

①topアクションがpagescontrollerにない => ある
②top.html.erbがない => ある
③rake routes  => routeもきちんと通っている
？？　わからない

=>解決!! どうやら requestメソッドを使うとエラーになるらしい
=> 申し込みに使う(requestメソッドをapplyメソッドに変更)

>開発関連のTODOは以下
>トップページを追加 1,追加 2,内容
>撮影の流れのページ追加 1,追加 2,内容
>撮影依頼の申し込みページ　１,追加 2,実際に申し込み(DB)
>管理画面の追加　1,追加 2,その撮影依頼を管理画面で一覧 3,撮影後に写真の納品 4,写真を納品するとラブグラフのページに写真が表示(トップページ、写真一覧ページ、写真詳細ページ)

rspecとdockerのチュートリアルをやる
rspecは一回まとめる+テスト駆動開発を読む
dockerはチュートリアルのみでok


~15時50分
>rspecはほぼ完全に理解したと思う。
[rspec入門テスト](http://tech-drill.in/questions/12/answers/12)
⬆️が一番わかりやすい。さらに問題形式になっており、きちんと理解できているかのチェックができる。
[使えるrspec](https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5)
使えるrspecは1はもう理解した。
時間があるときに、rspecの2,3,4もやる＋[テスト駆動開発の本](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884)を買おう

復習
 - describe 
 - : テストをグループ化し、何に対してテストするのかを宣言するためのキーワード。利用するときは、テストしたい[クラス名]を渡し、もう一段ネストして、そのクラスのメソッドを渡すことが多い。メソッドの名前の接頭には#をつける。
 - context : 条件によっては、結果が分かれるメソッドをチェックする場合には、条件ごとにcontextでグループ化する
 - it
 -  : テストをexampleという単位にグループ化する。基本は一つのitブロックの中に、一つのエクスペクテーション。ブロックの中には変数の定義も可能。テストしたいクラスのインスタンスを生成し、エクスペクテーションで使う。
 - let
 -  : let(:foo){...}とすることで、...の値をfooとして参照。簡単に言えば、変数の定義。普通の変数と違う点は以下の二つ。1,定義された階層以下であれば、どこでも参照できる（specファイル上で定義された変数=>グループ内でのみ使用可能。、letで定義された変数=>グループ下の階層でも使用可能)
 - subject
 -  : テスト対策のオブジェクト、またはメソッドの利用が明確に一つに一つに決まっているとき、subject構文でコードの重複を防げる。

16:00~16:48　dockerの勉強
>[Docker　toolbox](https://www.docker.com/community-edition)からダウンロードする
[dockerのチュートリアル](https://dev.classmethod.jp/tool/docker/start-docker-tutorials/)をやる
[そろそろdocker始めないとやばいよ](http://tech.respect-pal.jp/docker_tutorial/)
dockerをきちんとやろうとしたらvirtualboxとvargrantが必要だからそれはまた今度やろう
[dockerを0から勉強する](https://qiita.com/nl0_blu/items/07e5047041ebe009dd06)

# ここから開発~~
1,管理画面のgemの勉強をして、何を使ってどうやるか決める。
⬇︎
管理画面等のことがよくわからないから実践ruby on rails4をやってみる
1.開発環境の構築 => vagrant installは謎。ループにハマった。。。。
導入はできないけど、開発環境について勉強したことをまとめる。
>#rails開発で仮想マシンを使う理由
問題：開発用のマシン(作用マシン)と実運用のマシン(プロダクションマシン)が違う。(ここでいう環境とは、OSの種類やバージョン、あるいはOS上で動くソフトウェアやライブラリの種類やバージョンを指している)よって不具合がでる可能性がある。
作業マシンとプロダクションマシンの環境を一致させる。
### 「解決策」
仮想マシンを構築する。
仮想マシンにCentOSや、Ubuntu ServerといったLinuxベースのServer OSをインストールする。
開発中のRailsアプリケーションは仮想マシン上で動作させる。
しかし、共有フォルダの機能によって、Railsアプリケーションのソースコードは、使い慣れたテキストエディタを使いながら、プロダクションマシンと同じ環境下で　Railsアプリケーションの開発が行える。
VirtualBoxがコンピューター上に仮想マシンを作り出すソフトウェアの一つ
土台となるマシンで動作しているOS　= ホストOS
仮想マシン上で動作しているOS = ゲストOS
Vagrant 仮想マシンの管理ツール
Vagrantfileと呼ばれる設定ファイルの記述に沿って、VirtualBoxのAPIを呼び出し、仮想マシンを作ったり、仮想マシンを起動・停止したりする。
また、ホストOSからゲストOSにSSHで簡単にログインできるようにお膳立てをし、共有フォルダの設定をしてくれる。


>#日々の開発作業
実はプロジェクトディレクトリ~/projects/xyzと/vagrantディレクトリはVagrantによって「共有フォルダ」に設定されている。
つまり、プロジェクトディレクトリのファイルを修正すれば、/vagrantディレクトリの同名ファイルに修正が反映される。/vagrantディレクトリにディレクトリやファイルを追加すれば、プロジェクトディレクトリ側にも現れる。
この仕組みのおかげで、Railsアプリケーションソースコードの編集作業をホストOS側で行うことができる。
一方、Railsアプリケーションの起動と停止は、ゲストOS側で行う。つまりSSHでログインした上、コマンドを順に実行することでRailsアプリケーションを起動する。

>#進行中の開発プロジェクトに途中から加わる場合
すでにVagrantを利用した開発プロジェクトが進行していて、あなたがそのプロジェクトに途中から加わる場合、開発環境の構築手順はとても簡単です。
まず、バージョン管理システムのリポジトリからソースコードを取得します。そのソースコードのルートディレクトリにはVagrantfileが含まれていることを確認する。
もし存在すれば、`vagrant up`を実行するだけ。