Ruby on rails もくもく会@渋谷に参加させていただきました


[こちら](https://startup-technology.connpass.com/event/71169/)の勉強会に参加させていただきましたので成果発表に使います。
お菓子とかいっぱいいただいちゃいました。ごめんなさい。

### やったこと
- [rails tutorial](https://railstutorial.jp/)を進める

### 具体的な成果
- [githubリポジトリ](https://github.com/tabtt3/rails_tutorial)

## scaffold便利

controller, modelをちょこちょこ作るのをまとめてくれてるのかな。
Laravelにも欲しい。
artisanコマンドに追加するライブラリ作ってみようかな。

```
rails generate scaffold User name:string email:string
```

なんか色々スケルトンを作ってくれた？

```
Running via Spring preloader in process 72614
      invoke  active_record
      create    db/migrate/20171111061119_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
      create      app/views/users/_user.json.jbuilder
      invoke  test_unit
      create    test/system/users_test.rb
      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
```

以下のURLにアクセス

```
http://localhost:3000/users
```

画面が表示された。

ルーティングについてちょっと見てみる。

```config/routes.rb
  resources :users
```

resourcefulルーティングが追加されてるっぽい。

具体的には、```rake routes```で確認できる。

```
   Prefix Verb   URI Pattern               Controller#Action
    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
     root GET    /                         users#index
```

追記
以下のようにルーティングを記述することも可能。

```config/routes.rb
get 'static_pages/home'
```

GETでstatic_page/homeにアクセスしたときに、staticPageControllerのhomeメソッドにアクセスする。

Laravelで書くのと同じだなー。って思ってました。

```routes/web.php
Route::get('static_page/home', 'staticPageController@home');
```


## railsのアプリケーションで使用するDBをsqliteから変更する

そもそもプロジェクトをnewするときに以下のように実行すればmysqlになる。

```
rails new [アプリ名] -d mysql
```

PostgreSqlは依存パッケージがあるのでちょっと面倒?もしかしたら以下でいけるかも。(試してないです、ごめんなさい)

```
rails new [アプリ名] -d postgresql
```

後から変更したいときは```app/config/database.yml```を以下のように変更する。
ユーザーは必要ならば作成する。
パッケージがないなら```gemfile```に追記して、```bundle update```。

```config/database.yml
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: [アプリ名]_development
  pool: 5
  username: root
  password:
  host: localhost

test:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: [アプリ名]_test
  pool: 5
  username: root
  password:
  host: localhost

production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: [アプリ名]_production
  pool: 5
  username: root
  password:
  host: localhost

```

## Active Record

LaravelのEloquentとほぼ同じなのでまぁいいか。という感じ。
生のSQLを書けるのかとかは知らない。


## バリデーションロジックの追加
Modelオブジェクトにvalidationの責務を持たせる。
プロパティを設定するときに落ちるのか、newするときに落ちるのかは知らない。

```app/models/micropost.rb
validates :content, length:{maximum: 140}
```

## リレーションの定義
Laravelと同じでModelでリレーションを定義する。
1対多のリレーション。

```app/models/user.rb
has_many :micropost
```

```app/models/micropst.rb
belongs_to :user
```

リレーションを定義しておくと、以下のようにオブジェクトチェーンできる。

```
>>> first_user = User.first

  User Load (0.7ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "[name]", email: "[mail]", created_at: "2017-11-11 06:54:54", updated_at: "2017-11-11 06:54:54">
first_user.micropst


>>> first_user.micropost

=> #<ActiveRecord::Associations::CollectionProxy [#<Micropost id: 1, 

  Micropost Load (0.2ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? LIMIT ?  [["user_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Micropost id: 1, content: "12345678901234567890123456789012345678901234567890...", user_id: 1, created_at: "2017-11-11 07:47:46", updated_at: "2017-11-11 07:47:46">]>


>>> first_user.micropost.first

  Micropost Load (0.2ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."id" ASC LIMIT ?  [["user_id", 1], ["LIMIT", 1]]
=> #<Micropost id: 1, content: "12345678901234567890123456789012345678901234567890...", user_id: 1, created_at: "2017-11-11 07:47:46", updated_at: "2017-11-11 07:47:46">
```



# おわりに
本イベントを主催していただいた[スタートアップテクノロジー](https://startup-technology.com/)の方々、ありがとうございました。