Ruby on Rails 勉強中201809~




20181010
--

間接的メソッド
--

Javaでいうカプセル化ができそうな印象。

```
class Piyo
  def hoge
    privatehoge
  end
 
    private
    def privatehoge
      puts "private"
    end
end

a = Piyo.new
a.hoge
#a.privatehoge エラーになります。
```
```
private
```


self
--

メソッド名につけると、クラスをインスタンス化しなくてもそのメソッドを呼び出せるようになる。

```ruby
class Piyo
  def self.hoge
  end
end

Piyo.hoge
```
```
```

この場合戻り値はないが、ちゃんとselef.hogeが呼び出される。

selfをメソッドの中で使用した場合

```ruby
class Piyo
  def hoge
  end
  def fuga
    self.hoge
  end
end

p = Piyo.new
p.fuga
```
```
```

このように記述すれば、Piyoクラスのfugaメソッドが呼び出され、その中で、Piyoクラスのhogeメソッドが呼び出される。

同じselfでも違った動作をする。


インスタンスメソッド
--

インスタンスメソッドはインスタンスからのみ実行できるよう。
https://qiita.com/amidara/items/27221675638cdc9bde6b

インスタンスメソッドの中で「initialize」と言う名前が付けられたメソッドは特殊なメソッドです。Javaで言うコンストラクタ。
https://www.rubylife.jp/ini/class/index5.html

三項演算子
--

if文を?で記述することができる。
a ? b : c
aが真であるなら、bを返し、
aが偽であるなら、cを返す。

長文や、（）が多くなるなど、複雑になると見づらくなる。

https://qiita.com/raccy/items/0b25b2f106e2a813828b


テスト環境でのcostコストパラメータ
--

テスト環境なのでMAXである31とかつかわなくてもよいだろうということで、なるべく軽くしておこなうそうです。
https://blog.motikan2010.com/entry/2017/02/13/%E3%80%90Go%E8%A8%80%E8%AA%9E%E3%80%91%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E5%8C%96%28bcrypt%29
これは、Go言語の例ですが、
default_cost 10
min_cost 4
max_cost 10
となっているので、たぶん
railsのmin_cost
定数だからMIN_COSTかな、は４だと思われる。



BCrypt
--

Blowfishという暗号化方式をプログラムで利用できるよう実装したもの。特許が取得されていない。認証システムでよくりようされている。
４~７文字目に、コスト(cost)というものがあり、これを帰ることでパスワードの複合が困難になる。強力なパスワードになる。
具体的には、
 $10$ (4〜7文字目)
このような書き方をして、２のｎ乗回繰り返します。$10$ならば、10回ではなく、2*2*2*2*2*2*2*2*2*2= 1024回演算を行う。
非常に強力そうな印象。4~31まで指定できるようです。

has_secure_password
--

インスタンスパブリックメソッド
引数にオプションがある。つけなくてもよい。




fixture
--

定着物、備え付け、備品
fixture

事前に用意したテストデータをDBから読み込み、常に利用できるようにしておくこと。？？？
事前に用意したテストデータを読み込み、常にDBの内容を一定に保つための仕組み。
fixture

これによって、regression,~~degrate~~degradeを行う。
たとえば、テストを行うときに、ログインしている状態が保たれていなければ、ログイン状態のテストができない。ログインしたときのプロフィール画面や、ログアウトを行う、といった動作に対するリンクの存在を確認したい時だ。
このようなregressionやdegradeを行うときに、fixtureという仕組みを使う。
事前に用意した、ログイン状態のテストデータを読み込み、データベースの状態をログインしている状態に保てば、ログアウトリンクや、プロフィール画面のリンクを確認できる。また、ログインリンクは存在しないはずなので、そのテストも行うことができる。

これがfixtureを用いたdegrade,regression。


回帰テスト regression degrade
----

デグレード　＝＝　ダウングレードではない。
前よりもわるくなる
degrade 劣化する 物理的変化などにより品質や性能が損なわれたり、技術革新でより優れた製品が出現することにより、性能が相対的に低下する現象
regression 回帰 一般にはもとの位置または状態に戻ること、あるいはそれを繰り返すこと
となっている。

言葉の意味を調べると分かりづらい。

回帰テスト

regression test
degrade test
non degrade test

とかいうらしい

元の状態よりも悪くなっていないかをテストする。

degrade
regression



Ruby on Rails　サーバーが既に起動しているため、表示されない
--


```
rails server
```

でエラーがでました。

そして、いつものごとく、打ち間違えたか、と思い打ち込んだコマンドを確認したけど、特に間違えていない。
、、、

ここで、さっき読んだ
https://qiita.com/hirokidaichi/items/27c757d92b6915e8ecf7
を思い出しました。

#エラーメッセージ・ログを読まない


（このQiitaの記事はとても心に残りました。自分の問題点を的確に突かれているような感覚でした。）これが原因ではないか、ということでエラーメッセージをよく読むと、

```
[11462] * Listening on tcp://localhost:8080
Exiting
/usr/local/rvm/gems/ruby-2.4.1/gems/puma-3.9.1/lib/puma/binder.rb:269:in `initialize': Address already in use - bind(2) for "127.0.0.1" port 8080 (Errno::EADDRINUSE)
```

なにやら、アドレスは既に使われている。といったことを言っています。

ぐぐりました
rails server 既に使用中のポート

すると、
https://code.i-harness.com/ja/q/e5fe4e
このサイトを発見

まず、

/your_project_path/tmp/pids/server.pid

このserver.pidファイルを削除します。

とあるので、探しましたが、そんなファイルはありませんでした。
、、、

とりあえずとばして、

```
ps -aef | grep rails
```

このコマンドを実行してみると

```
ec2-user 12152 12151  0 02:19 ?        00:00:00 vfs-worker {"pingInterval":5000,"nodePath":"/home/ec2-user/.c9/node_modules","tmuxBin":"/home/ec2-user/.c9/bin/tmux","root":"/","debug":false,"connectionTimeout":60000,"metapath":"/.c9/metadata","envmetapath":"/.c9/metadata/environment","projectDir":"/home/ec2-user/environment","sshConnectTimeout":30000,"portForwards":[{"from":8080,"to":33243},{"from":8081,"to":33244},{"from":8082,"to":33245}],"extendApi":{"collab":{"file":"c9.ide.collab/server/collab-server.js","user":{"userId":"271744518089","name":"root"},"project":{"workspaceId":"d62ddf84e1524629931bfcea32566a4c","name":"rails","type":"ec2"},"environment":{"id":"d62ddf84e1524629931bfcea32566a4c","name":"rails","type":"ec2"},"readonly":false,"nodePath":"/home/ec2-user/.c9/node_modules"},"ping":{"file":"c9.vfs.client/ping-service.js"},"store":{"file":"c9.vfs.client/store-service.js"}},"defaultEnv":{"HGUSER":"root","EDITOR":"","PORT":"8080","C9_PORT":"8080","IP":"127.0.0.1","C9_HOSTNAME":"18.221.87.18","C9_USER":"root","C9_PROJECT":"rails","C9_PID":"d62ddf84e1524629931bfcea32566a4c"}}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
ec2-user 12454 12453  0 02:20 ?        00:00:00 vfs-worker {"pingInterval":5000,"nodePath":"/home/ec2-user/.c9/node_modules","tmuxBin":"/home/ec2-user/.c9/bin/tmux","root":"/","debug":false,"connectionTimeout":60000,"metapath":"/.c9/metadata","envmetapath":"/.c9/metadata/environment","projectDir":"/home/ec2-user/environment","sshConnectTimeout":30000,"portForwards":[],"extendApi":{"collab":{"file":"c9.ide.collab/server/collab-server.js","user":{"userId":"271744518089","name":"root"},"project":{"workspaceId":"d62ddf84e1524629931bfcea32566a4c","name":"rails","type":"ec2"},"environment":{"id":"d62ddf84e1524629931bfcea32566a4c","name":"rails","type":"ec2"},"readonly":false,"nodePath":"/home/ec2-user/.c9/node_modules"},"ping":{"file":"c9.vfs.client/ping-service.js"},"store":{"file":"c9.vfs.client/store-service.js"}},"defaultEnv":{"HGUSER":"root","EDITOR":"","PORT":"8080","C9_PORT":"8080","IP":"127.0.0.1","C9_HOSTNAME":"18.221.87.18","C9_USER":"root","C9_PROJECT":"rails","C9_PID":"d62ddf84e1524629931bfcea32566a4c"}}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
ec2-user 12973 10973  0 02:26 pts/5    00:00:00 grep --color=auto rails
```

な、ながいと思い、
またはこのコマンドで
という記述があったので、別のコマンドを実行。

```
sudo lsof -wni tcp:3000
```

なにもでません。、、、ここでポート名という記述をみつけ、そういえば、8080だなと思い、コマンドを変更。

```
$ sudo lsof -wni tcp:8080
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby    6138 ec2-user   11u  IPv4  23307      0t0  TCP 127.0.0.1:webcache (LISTEN)
ruby    6140 ec2-user   11u  IPv4  23307      0t0  TCP 127.0.0.1:webcache (LISTEN)
```

今度は、okでした。そして、先ほどよりも見やすい結果がでました
ということで次の手順、

```
kill -9 pID
```

とあったので、これで実行しましたが、なにもおこりません。
、、、よくみると、pIDという箇所が先ほどのコマンドの実行結果にあるのを発見。
6138
6140
とふたつあったので、

```
$ kill -9 6138
$ kill -9 6140
```

二つのコマンドを実行。
そして、
一応確認もこめて、

```
$ sudo lsof -wni tcp:8080
```

このコマンドを実行してみると、さっきは、ポート番号などが表示されましたが、なにも表示されませんでした。
お、これはちゃんとサーバーがとまったようだ、と思い、

```
$ rails server
```

で、サーバーを起動してみるとうまく起動。

おー、エラーメッセージ読むのってほんとに大事だなと改めて実感しました。





Qiitaでの　embedded Rubyの記述をメモしておこうとしたけどできなかった。
--

```erb

```

一時間くらい考えたけどできなかったので、あきらめました

```` erb ```


↑一番近いやつ
マークダウンで```erb を表示させるにはどうすればいいんだろう。
いつかわかるかもしれない。
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
参考記事


`` `バッククオート` `` 

これは分かったんだけど、先頭だけってなるとできない。


>
```erb


||=について
--

ちょっとこれは、書かないほうがよい気がしてきた。
遅延評価とか、正格評価とか出てきて理解しきれない。
読む方は参考程度に読んで下さい。

まず、||=について理解するために、論理演算を復習します。

e-wordより
>論理演算とは、「真」(true)、「偽」(false)の2通りの値(真偽値)しか持たないデータの演算。

となっています。

真の値を“1”、偽の値を“0”とすると

OR　論理和

|入力1|0	|0|1|1|
|---|---|---|---|---|
|入力2|0|1|0|1|
|出力|0|	1|1|1|

このようになります。

また、論理演算子には、ショートサーキット評価があります。
MDN web docsより

>論理演算子は左から右へ評価されるため、論理演算子で左辺を評価した時点で論理式の結果が確定した場合には右辺の評価を行わないことを、ショートサーキット評価といいます。例えば、A && Bという論理式があった場合、Aがfalseなら、その時点で式全体の結果はfalseで確定するため、Bがどうであるかについてはチェックしません。:

>false && (anything) をショートサーキット評価すると、false になります。
true || (anything) をショートサーキット評価すると、true になります。
　上記の式の anything の部分は評価されません。また、上記の式の anything の部分は (括弧で示しているとおり) ひとつの論理式ですので注意してください。

このように、ショートサーキット評価をすると

>false && (anything) #=> false
true || (anything) #=> true

このような結果が返ります。左辺を評価した時点で、右辺の評価を行いません。

以上のことから、最初の

```
式1 ||= 式2
```

は、

```
式1 || (式1 = 式2)
```

省略しないとこうなります。
上記式を評価します。

式1がtrueの場合

```
式1 || (式1 = 式2)
↓
式1 || 式2
↓
式1
```

演算子の評価順によって、まずは()を評価します。
()内で式1に式2を代入します。
そして、ショートサーキットで式2は評価されず、式1が答えになります。



論理演算子
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_Operators
演算子評価順
https://ja.wikipedia.org/wiki/%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D

20181009
--

第8章 基本的なログイン機構 リスト８．７
--

リスト 8.7: ユーザーをデータベースから見つけて検証する

```rb
class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      # ユーザーログイン後にユーザー情報のページにリダイレクトする
    else
      # エラーメッセージを作成する
      render 'new'
    end
  end

  def destroy
  end
end
```

の中から、

```rb
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
```

この行を調べました。

Rubyリファレンス(findメソッド)
>findメソッドは、要素を探して取り出します。ブロック引数itemに要素を入れながらブロックを繰り返し、ブロックが真が返したときは繰り返しを中断してその要素を返します。ブロックの戻り値がすべて偽であればnilを返します。

findメソッドは要素を返す（真である）
か、
nilを返す(偽である)
ということが分かります。


また、authenticateメソッドについては、

```
>> user.authenticate("not_the_right_password")
false
```
```
>> user.authenticate("foobaz")
false
```

>間違ったパスワードを与えた結果、user.authenticateがfalseを返したことがわかります。

という記述と、

>次に、正しいパスワードを与えてみましょう。今度はauthenticateがそのユーザーオブジェクトを返すようになります。

```
>> user.authenticate("foobar")
```
```
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 20:36:46", updated_at: "2016-05-23 20:36:46",
password_digest: "$2a$10$xxucoRlMp06RLJSfWpZ8hO8Dt9AZXlGRi3usP3njQg3...">
```

という記述から分かるように、
authenticateメソッドは、
ユーザーオブジェクトを返す(真である)
falseを返す、(偽である)

ということがわかったので、

```
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
```

このプログラムは、
userに戻り値があれば、真である、なければ、偽である。
また、
user.authenticateでも戻り値があれば、真である、なければ偽である。
という二つの値を　&&　で比較し、true && true の場合のみ
if文の条件が真である場合のブロックを実行します。


以下メモです
===

6.1.4 ユーザーオブジェクトを検索する
6.3.4 ユーザーの作成と認証

を参考にしています。

```
>> User.find_by(email: "mhartl@example.com")
```

の戻り値は

```
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 19:05:58", updated_at: "2016-05-23 19:05:58">
```

上記のようになっていて、

```
>> user.authenticate("foobar")
```

の戻り値は

```
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 20:36:46", updated_at: "2016-05-23 20:36:46",
password_digest: "$2a$10$xxucoRlMp06RLJSfWpZ8hO8Dt9AZXlGRi3usP3njQg3...">
```

上記のようになっているので、

GET　POST　の違い　/login　Ruby on Rails 8.1.2　演習
--

Ruby on Rails
8.1.2 ログインフォーム
演習内容についてです

>演習
リスト 8.4で定義したフォームで送信すると、Sessionsコントローラのcreateアクションに到達します。Railsはこれをどうやって実現しているでしょうか? 考えてみてください。ヒント:[表 8.1](https://railstutorial.jp/chapters/basic_login?version=5.1#table-RESTful_sessions)とリスト [8.5](https://railstutorial.jp/chapters/basic_login?version=5.1#code-login_form_html)の１行目に注目してください。

表８．１です見づらかったら、リンク先を参照

|HTTPリクエスト|URL|名前付きルート|アクション名|用途|
|----|----|----|----|----|
|GET|/login|login_path|new|新しいセッションのページ (ログイン)|
|POST|/login|login_path|create|新しいセッションの作成 (ログイン)|
|DELETE|/logout|logout_path|destroy|セッションの削除 (ログアウト)|

リスト８．５一行目です。　残りはリンク先参照
\<form accept-charset="UTF-8" action="/login" method="post">

りすと８．５一行目を見ると

- action="/login"
- method="post"

となっています。

しかし、リスト８．５のもとになっている、ソースコードは

```erb
<% provide(:title, "Log in") %>
<h1>Log in</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(:session, url: login_path) do |f| %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.submit "Log in", class: "btn btn-primary" %>
    <% end %>

    <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>
```

となっていて、どこにも post　とかいてません。

```erb
<%= form_for(:session, url: login_path) do |f| %>
```

たぶん、この行の　login_path　をみて、railsが判断しているんだとは思うんですけど、
しかしそれなら、

rake routes
をみます。

```
$ rake routes
   Prefix Verb   URI Pattern               Controller#Action
     root GET    /                         static_pages#home
     help GET    /help(.:format)           static_pages#help
    about GET    /about(.:format)          static_pages#about  contact GET    /contact(.:format)        static_pages#contact   signup GET    /signup(.:format)         users#new
    login GET    /login(.:format)          sessions#new
          POST   /login(.:format)          sessions#create
   logout DELETE /logout(.:format)         sessions#destroy
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
```

これと、表８．１をみたとおり、
login_pathは二つあります。
GETとPOSTです。

なので、GETとPOSTの違いを調べます。

https://www.futomi.com/lecture/form/index.html

>入力データをCGIに引き渡す方法（METHOD）として、「GET」と「POST」があります。このMETHODの指定は、入力フォーム（HTML）上で、<INPUT>タグ内で指定します。

>GET METHODは、HTTP/0.9から規定されており、データをサーバに送る手段として、当時においては唯一の手段でした。ただ、２５５文字分しか有効にならないという制限がありました。しかも、URLエンコード（後述）した状態で２５５文字までですので、複雑なフォームを送信しようとするには限界がありました。

>これを改善するかのように、最大有効文字数という制限がない POST という手段が規定されました。ただ、リクエスト時のHTTPヘッダーに、Content-Lengthヘッダーを含める必要があります。通常、ブラウザーでの実装となりますので、データを受け取る側のCGIでは考慮する必要はありません。ただ、CGIからHTTPリクエストを送出する場合には、考慮しなければいけません。

とあるので、最大有効文字数に制限がないPOSTが使われそうです。
しかし、まだ核心に至らないので、

疲れたのであきらめました。

結果として、今つくっているページはLog inページであり、これは、EmailとPasswordをページ上のフォームに入力し、ブラウザから送信する。

となるので、今回の場合は、POSTがRailsによって判断されるのではないか。という結論になりました。

form_withが推奨されているみたいだから、form_withに書き換えてみよう。
https://techracho.bpsinc.jp/hachi8833/2017_04_20/38378

以下個人的メモです。内容にはあまり関係ないと思います。
--



ヒントを見てもわからない
ググりまくる



第3章
ほぼ静的なページの作成
コラム 3.2. GETやその他のHTTPメソッドについて
>HTTP (HyperText Transfer Protocol) には4つの基本的な操作があり、それぞれGET、POST、PATCH、DELETEという4つの動詞に対応づけられています。クライアント (例えばFirefoxやSafariなどのWebブラウザ) とサーバー (ApacheやNginxなどのWebサーバー) は、上で述べた4つの基本操作を互いに認識できるようになっています (ローカル環境でRailsアプリケーションを開発しているときは、クライアントとサーバーが同じコンピュータ上で動いていますが、一般的には、それぞれ別のコンピュータで動作しているという点を理解しておいてください)。Railsを含む多くのWebフレームワークは、HTTPの各操作を発展させたRESTアーキテクチャの影響を受けています。第2章でも簡単に触れましたが、第7章ではより深い内容について学びます。
GETは最も頻繁に使われるHTTPリクエストで、主にWeb上のデータを読み取る (get) ときに使われます。「ページを取得する (get a page)」という意味のとおり、ブラウザはhttp://www.google.com/やhttp://www.wikipedia.org/
などのWebサイトを開くたびにGETリクエストをサイトに送信します。POSTは、GETの次によく使用されるリクエストで、ページ上のフォームに入力した値を、ブラウザから送信する時に使われます。例えばRailsアプリケーションでは、POSTリクエストは何かを作成するときによく使われます (なお本来のHTTPでは、POSTを更新に使ってもよいとしています)。例えばユーザー登録フォームで新しいユーザーを作成するときは、POSTリクエストを送信します。他にも、PATCHと DELETEという2つの操作があり、それぞれサーバー上の何かを更新したり削除したりするときに使われます。これら2つの操作は、GETやPOSTほどは使われていません。これは、ブラウザがPATCHとDELETEをネイティブでは送信しないからです。しかし、Ruby on Railsなどの多くのWebフレームワークは、ブラウザがこれらの操作のリクエストを送信しているかのように見せかける技術 (偽装) を駆使して、PATCHとDELETEという操作を実現しています。結果として、Railsはこの4つのHTTPリクエスト (GET・POST・PATCH・DELETE) を全てサポートできるようになりました。


から抜粋
>GETは最も頻繁に使われるHTTPリクエストで、主にWeb上のデータを読み取る (get) ときに使われます。「ページを取得する (get a page)」という意味のとおり、ブラウザはhttp://www.google.com/やhttp://www.wikipedia.org/
などのWebサイトを開くたびにGETリクエストをサイトに送信します。

とかいてあるように、getはweb上のデータを読み取ります。

また、ポストは
>POSTは、GETの次によく使用されるリクエストで、ページ上のフォームに入力した値を、ブラウザから送信する時に使われます。例えばRailsアプリケーションでは、POSTリクエストは何かを作成するときによく使われます

とかいてあるように、ブラウザから送信するときに使われます。

そこから考えると、今つくっているページはLog inページであり、これは、EmailとPasswordをページ上のフォームに入力し、ブラウザから送信する。

となるので、今回の

https://www.futomi.com/lecture/form/index.html

```
$ rake routes
   Prefix Verb   URI Pattern               Controller#Action
     root GET    /                         static_pages#home
     help GET    /help(.:format)           static_pages#help
    about GET    /about(.:format)          static_pages#about  contact GET    /contact(.:format)        static_pages#contact   signup GET    /signup(.:format)         users#new
    login GET    /login(.:format)          sessions#new
          POST   /login(.:format)          sessions#create
   logout DELETE /logout(.:format)         sessions#destroy
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
```





、、、、わかった。わかってなかった。これはsubmit_tagのはなし。
リスト８．４をみます。

リスト 8.4: ログインフォームのコード
app/views/sessions/new.html.erb

```erb:html.erb
 <% provide(:title, "Log in") %>
<h1>Log in</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(:session, url: login_path) do |f| %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.submit "Log in", class: "btn btn-primary" %>
    <% end %>

    <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>
```

この中で注目するのは

```erb
<%= f.submit "Log in", class: "btn btn-primary" %>
```

これです。submitです。
submitを[Railsドキュメント](http://railsdoc.com/references/submit)で調べると、
>引数を指定しないと、対象のモデルが保存済みかを調べて、「Create モデル名」「Update モデル名」のどちらかを表示する。

とあります。つまり、submitをクリックした時には、Createか、Updateしか実行されません。

rails routes grep　または　rake routes grep つかいかた
--

動作環境は下に書きました

grepとは
--

グーグル辞書でしらべたところ、grepは

グレープ

だそうです。くだものですね、、

違うと思ったので、Wikipediaを調べたところ

「global regular expression print(ファイル全体から/正規表現に一致する行を/表示する)」

とのことです。こっちでしょう。grepっていう英語があると思ってました。

やってみます
---

rails routes grep

のまえに、まずは

rails routes

を実行します。こうしてみると、grepとのちがいが分かりやすいのでやってみてください

※ここから先はすべて、コンソール上での動作になります

```
$ rails routes 
   Prefix Verb   URI Pattern               Controller#Action2-user:~/environment/s     root GET    /                         static_pages#home
     help GET    /help(.:format)           static_pages#help
    about GET    /about(.:format)          static_pages#about
  contact GET    /contact(.:format)        static_pages#contact
   signup GET    /signup(.:format)         users#new
    login GET    /login(.:format)          sessions#new
          POST   /login(.:format)          sessions#create
   logout DELETE /logout(.:format)         sessions#destroy
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
```

次に、しぼりこみます(grep)
例えば、POSTなら

```
$ rails routes | grep POST
          POST   /login(.:format)          sessions#create
```

このように、POSTが書いてある行だけ見れます

他にも、、、こんな調べ方する人はいないとおもいますが、

ew_useで調べれば、


```
$ rails routes | grep ew_use
 new_user GET    /users/new(.:format)      users#new
```

このように、new_userという文字に含まれるew_useをしぼりこむこともできます。

注意点として、大文字　小文字　をくべつします。

例えば、

```
$ rails routes | grep User
```

このように、User(大文字)では、なにもしぼりこむことができません。
また、user（小文字）なら

```
$ rails routes | grep user
   signup GET    /signup(.:format)         users#new
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
ec2-user:~/environment/sample_app (basic-login) $ 
```

このようになります
このことに気づかず、最初

何でだ、なにも検索できない、、、、

ということになったので、きをつけてください。


動作環境です
--

AWSです

\$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
$ rails -v
Rails 5.1.6

render text  表示されない　render plain 表示される
--

AWSです
ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
rails --version
Rails 5.1.6

結果：plain を使うとよい。
--

renderメソッドのオプションには種類がありますが、ここでは

- text
- plain

の二つを取り上げます。

```
rails generate controller names show
```

で

namesコントローラー
showアクション

を作成します

作成されたコントローラクラス(app/controllers/names_controller.rb)を次のように修正します。

```ruby
class NameController < ApplicationController
  def show
    render text: "hello, world!"
  end
end
```

またルーティングの設定ファイルである「config/routes.rb」を次のように修正します。

```ruby
Rails.application.routes.draw do
  root "names#show"
end
```

ブラウザでルートにアクセスします。

```


```

なにも表示されません！！
これですごい悩みました。書いてあるとおりやったのになぜだと

ということで、もう一度
(app/controllers/names_controller.rb)を次のように修正します。

```ruby
class NameController < ApplicationController
  def show
    render plain: "hello, world!"
  end
end
```

分かりづらいですが、text:　が　plain:　に変わっています。
それだけです。どうやらバージョンアップの結果こうなったそうです。

どうもうまくいかないなと思い、そういえば、チュートリアルではrender html:だったなと思い、試してみたら表示され、これはtext:が怪しいと思い調べてみたら解決しました。


参考URL：
Railsドキュメント
http://railsdoc.com/form

https://obel.hatenablog.jp/entry/20170613/1497335168

https://www.rubylife.jp/rails/controller/index6.html


メモ

```ruby
Rails.application.routes.draw do
  root "names#show"
end
```

root "names#show"
ウェブページのルートにアクセスした時、namesコントローラー(name_controller.rb)のshowメソッド(def show)にアクセスします。

ルート　Wikipedia
https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%83%9A%E3%83%BC%E3%82%B8

この中でctrlキー　+　f
で出てきた検索窓に、ルートを入れると出てきます。
最上位ページをルートといいます。


拾い物のクワインで遊んでみた
--

コード

```ruby
puts <<2*2,2
puts <<2*2,2
2
```
結果

```
puts <<2*2,2
puts <<2*2,2
2
```

コード

```ruby
puts <<1*2,3
puts <<4*5,6
7
```
結果

```
error
```

コード

```ruby
puts <<7*6,5
puts <<4*3,2
1
```
結果

```
error
```

コード

```ruby
puts <<2*2,2
puts <<4*3,2
2
```
結果

```
puts <<4*3,2
puts <<4*3,2
2
```

どうやら二行目を二回出力、その後に２を出力している。どの２かはわからない。

コード

```ruby
puts <<2*2,2
hello
2
```
結果

```
hello
hello
2
```

うんうん

コード

```ruby
puts <<2*2,100
hello
2
```
結果

```
hello
hello
100
```

一行目の末尾は最後に出力されている。

コード

```ruby
puts <<3*3,"last"
hello
3
```
結果

```
hello
hello
hello
last
```

うんうん。また、どこかの３でループ回数を決めている。*3かと思われる。

コード

```ruby
puts <<3*4,"last"
hello
3
```
結果

```
hello
hello
hello
hello
last
```

うんうん

コード

```ruby
puts <<1*4,"last"
hello
1
```
結果

```
hello
hello
hello
hello
last
```

うんうん。


結果
<<ヒアドキュメント名称*繰り返し回数,"繰り返しが終了したら出力したいもの"
繰り返し出力したいもの
ヒアドキュメント名称。

難しいなにかに見えたが、
１．ヒアドキュメントを繰り返し出力
２．その後に別の値をputsで出力
しているだけだった。

コード

```ruby
puts <<1,<<-3,5,<<6,8
2
1
4
     3
7
6
```

結果

```
2
4
5
7
8
```


満足した


ヒアドキュメント
--

ヒアドキュメントを使ってみました。

OK

```ruby
puts <<-EOS
bar
baz
EOS
```

```ruby
puts <<-EOS
bar
baz
      EOS
```

```ruby
puts <<EOS
bar
baz
EOS
```


NG

```ruby
puts <<EOS
bar
baz
  EOS###インデントを入れてはいけない。
```

<<EOS
の記述の場合は最後のEOSにインデントをいれてはいけません。

```ruby
puts << EOS
bar
baz
      EOS
```

<<　と　EOSの間にスペースを入れるとエラーです。

```ruby
puts <<- EOS
bar
baz
      EOS
```

<<-　とEOSの間にスペースを入れるとエラーです。


Ruby on Rails チュートリアル　7.3.4 失敗時のテスト　演習
--

問題の内容はこうなっています。

>演習１．
リスト 7.20で実装したエラーメッセージに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト 7.25にテンプレートを用意しておいたので、参考にしてください。

答えは分かったのですが、理解できなかったのでまとめてみました。
答えはこうです。

```ruby
    assert_select 'div#error_explanation'
    assert_select 'div.alert'
```

この部分は、
app/views/shared/_error_messages.html.erb
の内容をみると、

```ruby
  <div id="error_explanation">
    <div class="alert alert-danger">
```

このように書いているので、
div id=
div class=
のところから呼び出しているんだなというのは分かったんです。

だけど、それなら回答は、

assert_select 'div.alert'
ではなくて、
assert_select 'div.alert alert-danger'
これでいいのではないかと思ったんですが、テスト結果はエラー。

なので、

css クラス名　スペース

でぐぐってみました。

それによると、

記述の仕方は、
\<div class="alert alert-danger">
div.alert.alert-danger
の二通りの記述があることが分かりました。
それぞれの違いは、

\<div class="alert alert-danger">
・htmlに記述するときに使っている。
・今回は.html.erbに記述されていた。

div.alert.alert-danger
・cssに記述するときに使っている。
・今回は.rbファイルに記述されていた。


ということが分かりました。
htmlとcssの理解が必要だなと感じました。


また、今回学んだ内容から、
7.3.4の回答は、

```ruby

assert_select 'div.alert'
```

```ruby

assert_select 'div.alert.alert-danger'
```

と記述することができることもわかりました。
このような書き方をクラスセレクタを複数つなげて記述するというそうです。

rails test　でエラーがでる　という失敗
--

Ruby on Rails チュートリアルでの失敗です。
3.3.1 最初のテストをやっていたときです

```
$ rails test
```

を実行したら

```
FATAL: Listen error: unable to monitor directories for changes.
Visit https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers for info on how to fix this
```

というエラー。何度かテストは行ってきたのですが、このタイプのエラーは知りませんでした。

内容を日本語に翻訳。

致命的なエラー：ディレクトリの変更を監視できません。

とのこと。うーん、、

ということで rails server を　ctrl + c　でいったん終了して再起動。して、さいど


```
$ rails test
```

これでもエラー。
次は、rails console　を開いていたので、これをターミナルごと終了。

ここで

```
$ rails test
```

でエラーがでませんでした。
~~今のところ原因がよく分かっていないのですが、、、~~

エラー内容から
https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers
このURLにアクセスしてみたところ、

>ListenはデフォルトでLinux上でinotifyを使ってディレクトリの変更を監視します。監視できるファイル数にシステム制限があることは珍しくありません。たとえば、Ubuntu Lucidの（64ビット）inotifyの制限は8192に設定されています。

といった記述から、ディレクトリの変更を監視？できるファイル数に制限があるとのことで、たぶん制限をこえていたのだと思われますが、それがなぜ、ターミナルを消したら解決されたのか、についてはわかりませんでした。

まあ、おいおいわかる！かもしれない。

rails generate と rails destroy で失敗したこと
--

Ruby on Rails チュートリアル中に失敗しました。

まず、演習の前にチュートリアルに沿って（3.2.1 静的なページの生成）

```
$ rails generate controller StaticPages home help
```

を実行

その後に演習内容

>Fooというコントローラを生成し、その中にbarとbazアクションを追加してみてください。

を読み、

```
$ rails generate controller StaticPages foo
```

を実行し、演習の２番

>コラム 3.1で紹介したテクニックを駆使して、Fooコントローラとそれに関連するアクションを削除してみてください。

を読み、(コラム 3.1. 元に戻す方法)を参考に、コマンド

```
$ rails destroy controller StaticPages foo
```

を実行したところ、fooが消えたのよかったのですが、

なんと

先に作っていた

home

help

のviewとかいろいろと消滅。。

ということで、このことから

### controller StaticPages とはべつに、 controller fooを作成し、その中に bar baz　アクションを作って欲しかったのだと、理解。

なので、

```
$ rails generate controller StaticPages home help
```

まずは、controller StaticPages home help
をもう一度つくる、そして

```
$ rails generate controller foo bar baz
```

を実行し、fooコントローラーとbarとbazアクションを追加。
そのあとに、

```
$ rails generate controller foo bar baz
```

を実行し、予定通り、fooコントローラーと、bar,bazアクションを削除することに成功。

~~今回理解できていなかったことは~~
今回理解できたことは

- コントローラーとアクションがある。
- $ rails generate controller コントローラー名 アクション名　という記述をすること。
- アクション名は複数記述できる。

の三本でした。

branch名をリネームしてみた
--

#前提
Amazon Web Service（AWS）でRuby on Railsをやっているとき、

```git
git checkout -b <font color="Red">Rails</font>
```

としたいところを

誤って

```git
git checkout -b Ruby
```

としてしまいました。
その結果AWSには

```
ec2-user:~/environment/sample_app (Ruby) 
```

と表示されてしまったので修正。

#branch名の変更

```git
git branch -m 間違えたbranch名 正しいbranch名
```

で修正することができます。

なので

今回の場合

```git
git branch -m Ruby Rails
```

#結果
AWSには

```
ec2-user:~/environment/sample_app (Rails) 
```


#追記。試してみた

```git
git branch -m Ruby Rails
```

がいけるのなら

```git
git checkout -b modeling-users
```

のような感じで　　-b　　でもOKなのではないかと思いやってみた結果

```git
git -b -m Ruby Rails

Unknown option: -b
```

とgitに注意されました。。。