インターン 2日目(1月30日)





[ルーティングを極める](https://techracho.bpsinc.jp/baba/2014_02_17/15665)
読む
重要部分
>namespace
namespaceを指定してパスをグループ化することができる。これを使用して、例えば管理用ページ(admin)のパスや置き場所を仕切ることができる。

```ruby
namespace :page do
  get :privacy_policy
  get :company_information
  get :term_of_use
  get :businessdeal
end
```
![スクリーンショット 0030-01-30 午前5.10.20.png](https://qiita-image-store.s3.amazonaws.com/0/228601/848aa943-5cc2-f512-d7ad-cc0f065cb652.png)
上のように、名前付きルートとパスとコントローラ#アクションにpageが追加されました。
上は素朴なgetメソッドルーティングでしたが、resourcesルーティングに名前空間を与えることもできます。

```ruby
namespace :admin do
  resources :users
end
```

![スクリーンショット 0030-01-30 午前5.13.12.png](https://qiita-image-store.s3.amazonaws.com/0/228601/878874d8-68ea-afc0-dc0b-627de7fb8fed.png)

同じく、名前付きルートとパスとコントローラ#アクションにadminが追加されました。
:moduleオプションを使用して、resourcesに名前空間を与えることもできますが、これは上と少し動作が異なります。

```ruby
resources :users, module: :admin

# 以下も大事
scope module: :admin do
  resources :users
end
```

![スクリーンショット 0030-01-30 午前5.16.22.png](https://qiita-image-store.s3.amazonaws.com/0/228601/e7c14375-0d40-2a1a-d726-dc398f6c2f16.png)

こちらはコントローラ#アクションにしかadmin名前空間が追加されていません。
ここからわかるように、パスには表したくないが別のディレクトリにまとめたいコントローラがある場合に使用できる。

>collectionとmenmber
resourcesを使えば、主要な7つのルーティングが自動的に追加されますが、それ以外のルーティングそのリソースに追加したい場合はmemberまたはcollectionを使用します。
「collection(集合)はidなし、member(個別)はidあり」と覚える。

```ruby
resources :books do
  collection do
    post :search
    post :remove_multi
  end
  member do
    get :thumbnail
    get :sample_file
  end
end
```

![スクリーンショット 0030-01-30 午前5.19.57.png](https://qiita-image-store.s3.amazonaws.com/0/228601/29ca8b05-40da-634f-c804-2dd7dcb7d5d9.png)

見ての通り、いつもの7つのルーティングに加えて4つのルーティングがある。
そしてcollectionで指定した2つにはidはなく、memberで指定した2つにはidがある。
以下のような簡易版もある

```ruby
resources :books do
  post :search, on: :collection
  get :thumbnail, on: :member
end
```
何も指定しない時はデフォルトでmember扱い

>root

```ruby
root to: 'pages#top'
```

>オプション指定

onlyとexceptionオプション
主要なアクション(index,show,new,create,edit,update,destroy)を限定できる。

```ruby
#indexとshowアクションだけを使用する
resources :prefectures, only: [:index, :show]
#destroyアクション以外を使用する
resources :prefectures, except: :destroy
```

##実際にやる
headerとfooterを作る
[bootstrap](https://getbootstrap.com/docs/3.3/getting-started/)で作る。
[ 導入方法](http://neos21.hatenablog.com/entry/2017/03/17/000347)

Less：「The Dynamic Stylesheet language」の略。Node.js パッケージでインストールすることが多い。
Sass：「Syntactically Awesome Style Sheets」の略。Ruby ベースなので gem でインストールする。
Scss：Sass の表記法の1つ。元々の Sass がブレース {} を使わない記法だったりするのに対し、Scss はブレースを使うのでピュアな CSS っぽい見た目で書ける。

二つのgemを追加する必要があったけれど、`gem 'sass-rails'`はもともとあったからもともとある方を残した。
色々あって導入は完了。

bootstrapでheaderとfooterを代入する。
renderと_header.html.erb,_footer.html.erbができた。
`rails s`ができない
= > エラー　routeのエラーが出てた

```ruby
root to: 'home/top'
```
rootの書き方はあってる。
間違いは`/`を`#`にする必要があり、解決。
[他のファイルから呼び出す](http://ruby-rails.hatenadiary.com/entry/20140807/1407419013)
　headerでリンク移動ができるようにlink_to(http://railsdoc.com/references/link_to)
[link_toにクラスをもたせたい](http://ruby-rails.hatenadiary.com/entry/20150210/1423494000)
これにてheaderは完成。

次は、申し込みフォームを作る。
申し込みフォールの処理のフローは以下

>1,Controllerの`newメソッド`でModelオブジェクトを生成し、インスタンス変数(ex:@user)に値を設定 (`@user = User.new`でUserはModelオブジェクト)
2,Viewの`form_forメソッド`でModelオブジェクトのカラムを使用したフォームを作成し、表示する。
3,ユーザーがsubmitすると、params変数に入力したパラメーターがハッシュの形で設定されてControllerに届く。
4,Controllerの`createメソッド`でparams変数でModelオブジェクトを作成する。

新規登録のフロー(詳細)
0,前提
Userテーブルには必要なカラムが存在していて,`user.rbカラム`が作成されている。

[データベースオブジェクトの命名規約](https://qiita.com/genzouw/items/35022fa96c120e67c637)
①全般
1,大文字を使用しない
テーブル名、カラム名共に大文字を利用しない。
(DBにより、大文字小文字を区別するもの、しないものがあるから)
2,複数単語の連携がスネークケース
テーブル名、カラム名ともにスネークケースを利用する。
ex)table_name
3,英語表記
基本的にはローマ字ではなく、英語で。
4,略名は利用しない。
× start_dt
○ start_date
②テーブル
1,基本系は~s（複数形)
2,n:nのテーブル
~s(複数形)+ "_" +~s(複数形)
ex)users_categories

[カラムの型](https://qiita.com/Kaisyou/items/07840398e60cedcd2f0f)


```ruby:app/model/user.rb
class User < ActiveRecord::Base
end
```


1,Controllerの`newメソッド`でModelオブジェクトを生成し、インスタンス変数(ex:@user)に値を設定 (`@user = User.new`でUserはModelオブジェクト)

```ruby:app/controllers/users_controller.rb

def new
  @user = User.new
end

end
#@userに空のModelオブジェクトを作成し、インスタンス変数@userに設定
#@userはviewでも使えるインスタンス変数
#Controllerでrenderやredirect_toなどで明示的にレンダリングするviewをしていない場合は、メソッド名のViewファイルがレンダリングされる。(ex:new => new.html.erb)
 ```

2,Viewの`form_forメソッド`でModelオブジェクトのカラムを使用したフォームを作成し、表示する。

```ruby:app/view/users/new.html.erb
#form_forに @userを渡すことにより、Userテーブルのテキストフィールドやラベルなどのinput要素を簡易に作成することができる
#今回は例として、nameとemailのカラムを持つとする。
<%= form_for @user do |f| %>

  <div class="field">
    <%= f.label :name, "名前" %>
    <%= f.text_field :name %>
  </div>

  <div class="field">
    <%= f.label :email, "メールアドレス" %>
    <%= f.text_field :email %>
  </div>

  <div class="actions">
    <%= f.submit "登録する" %>
  </div>
<% end %>
```

この記述の例である

```ruby
<%= f.label :name, "名前" %>
<%= f.text_field :name %>
```

は以下のようにhtml表記される

```ruby
<div class="field">
  <label for="user_name">名前</label>
  <input id="user_name" name="user[name]" type="text">
</div>
```
3,ユーザーがsubmitすると、params変数に入力したパラメーターがハッシュの形で設定されてControllerに届く。

先ほどの、`input要素`の`name属性`をキーとしてハッシュ形式でparamsに設定される。

```ruby
params =
{
 user:{# params[:user]で{ name: "鈴木", email: "suzu..." }を取得可能
  name: "鈴木", #params[:user][:name]で値を取得可能
  email: "suzuki@example.com" #params[:user][:email]で値を取得可能
 }
}
```

4,Controllerの`createメソッド`でparams変数でModelオブジェクトを作成

```ruby:app/controllers/users_controller.rb
...
def create
 @user = User.new(user_params)
 if @user.save
  # @userはuser_path(@user)に自動変換される
   redict_to @user, notice: "ユーザ登録しました。"
 else
  #ValiationエラーなどでDBに保存できない場合 new.html.erbを再表示
   render 'new'
 end

 private
   #Rails4からStrongParameterと呼ばれる機能が追加
   #セキュリティのため、permitメソッドで許可したパラメータ名しか取得できません。
  def user_params
    params.require(:user).permit(:name, :email)
  end
end
```