Progate Ruby on Rails5 I〜III 個人的ざっくりまとめ

# Railsの立ち上げ

```:ターミナル
$ rails new アプリケーション名     例）　rails new tweet_app

$ rails server
```
上記入力後、ブラウザのurlに「localhost:3000」を入力し、「Yay!You're on Rails!」と書いてあるページが表示されていればOK


# ページ作成
○ページ作成に必要なもの
・ ビュー
・ コントローラ
・ ルーティング


# ビュー

**ビューとは、ページの見た目を作るHTMLファイルのこと。**

```:ターミナル
$ rails generate controller コントローラ名 アクション名

例）rails generate controller home top または、 rails g controller home top でもOK
```
「rails g controller home top」でviewsフォルダの中にhomeフォルダとtop.html.erbファイルが作成される。

```html:app/views/home/top.html.erb
<h1>Home#top</h1>
<p>Find me in app/views/home/top.html.erb</p>
```


# コントローラ

ページを表示するとき、railsではコントローラを経由して、ブラウザに返している。

先ほど、「rails g controller home top」を実行したとき、同時にコントローラも作成されており、コントローラファイルの場所は、「app/controllers/home_controller.rb」である。

また、rails g controllerでtopアクションも指定しているため、home_controller.rbの中身は以下のようになっている。

```ruby:app/controllers/home_controller.rb
class HomeController < ApplicationController
  def top #アクション
  end
end
```

**コントローラ内のアクションは、コントローラと同じ名前のビューフォルダから、アクションと同じ名前のHTMLファイルを探して、ブラウザに返す役割を担っている**


# ルーティング

ページを表示するときコントローラを経由していたが、ブラウザとコントローラを結ぶ役割がルーティングである。

ルーティングは対応表にして考えるとわかりやすい

|URL|コントローラ|アクション|
|:--:|:--:|:--:|
|home/top|home|top|

ルーティングが定義されている場所は、「config/routes.rb」で、中身は以下のようになっている

```ruby:config/routes.rb
Rails.application.routes.draw do
  #get "URL" => "コントローラ名#アクション名"
  get "home/top" => "home#top" #localhost:3000/home/top

  #URLの部分を「top」に変えると、localhost:3000/topでアクセスできるようになる
  get "top" => "home#top" #localhost:3000/top

  #トップページの場合は、URLの部分を"/"にする
  get "/" => "home#top"
end
```


# CSSファイルや画像を保存するファイルの場所

○CSSファイル
「app/assets/stylesheets/コントローラ名.scss」

○画像を保存するファイル
「public/画像名」


# <% %>と<%= %>

<% %>は中身が表示されないので、変数の定義などに使われる。
<%= %>は中身が表示される。

```erb
<% language = "Ruby" %>

<%= language %>を学ぼう
Rubyを学ぼう

<% language %>を学ぼう
を学ぼう
```


# @変数

通常、アクションで定義した変数をビューでそのまま使用することはできない。
そこで、「@変数」とすることで、ビューでも使えるようにする。

```ruby:posts_controller.rb
class PostsController < ApplicationController
  def index
    @post1 = "hogehoge"
    
    post2 = "fugafuga"
  end
end
```

```erb:posts/index.html.erb
<%= @post1 %>
hogehoge

<%= post2 %>
※エラー発生
```


# テーブル作成（モデルとマイグレーション）

```:ターミナル
$ rails g model モデル名 カラム名:データ型

例） rails g model Post content:text
```

上記をターミナルに入力し実行すると、「**モデルが定義されたファイル**」と「**マイグレーションファイル**」の2つファイルが生成される。

モデルが定義されたファイルの場所は、「app/models/ファイル名.rb」(ファイル名は単数形)

```rb:models/post.rb
class Post < ApplicationRecord
end
```

マイグレーションファイルの場所は、「db/migrate/マイグレーション名.rb」

```rb:db/migrate/20170228021417_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.0]
  def change
    create_table :posts do |t|
      t.text :content
      
      t.timestamps
    end
  end
end
```

**マイグレーションファイルを使って、データベースに変更を反映するにはターミナルに以下を実行する**

```:ターミナル
$ rails db:migrate
```


# rails console

rails consoleはRubyのコードを手軽に実行できる。「quit」でやめることができる。

```:ターミナル
$ rails console
Loading Development environment (Rails 5.0.1)
[1]pry(main) > 1 + 1 
=> 2
[2]pry(main) > text = "Hello"
=> "Hello"
[3]pry(main) > text + "World"
=> "HelloWorld"
[3]pry(main) > quit
```


# saveメソッド

**saveメソッドはデータベースに保存するメソッド。**
例えば、作成したPostインスタンスをpostsテーブルに保存するとき。（このとき、saveメソッドが使えるのは、PostモデルがApplicationRecordを継承しているから）

```:ターミナル
$ rails console
> post = Post.new(content: "Hello World")
> post.save
```

# firstメソッド

**firstメソッドはテーブルの最初のデータを取得できる。**

postsテーブル

|id|content|
|:--:|:--:|
|1|hogehoge|
|2|fugafuga|

```:ターミナル
> post = Post.first
> post.content
=> "hogehoge"
```


# allメソッド

**allメソッドはテーブルの全てのデータを取得できる。**
index番号を指定することで特定の箇所のデータを取得することもできる。

postsテーブル

|id|content|
|:--:|:--:|
|1|hogehoge|
|2|fugafuga|

```:ターミナル
> post = Post.all[1].content
=> "fugafuga"
```


# link_toメソッド

**link_toメソッドは「第一引数に表示する文字」、「第二引数にURL」**

```erb:application.html.erb
<%= link_to("News", "/news") %>
```
↓　以下のように変換される

```html:application.html
<a href="/news">News</a>
```


# find_byメソッド

find_byメソッドは、特定のidの投稿を取得できる。（allメソッドのindex番号指定でも同じことができる）

postsテーブル

|id|content|
|:--:|:--:|
|1|hogehoge|
|2|fugafuga|

```:ターミナル
> post = Post.find_by(id: 1)
> post.content
=> "hogehoge"
```


# 変数Params

**変数Paramsは、ルーティングで設定したURLの「：id」の値を取得できる。**
コントローラのアクション内で使う。

例）ルーティングを「localhost:3000/posts/1」に設定した場合

```
get "post/:id" => "post#show"
```

```rb:posts_controller.rb
def show
  @id = params[:id]
end
```

```erb:posts/show.html.erb
<%= @id %>

結果は「1」と出る
```


# ルーティングでデータベースに変更を加えるアクションの場合は「get」ではなく「post」

```rb:routes.rb
post "posts/create" => "posts#create"
```

# form_tagメソッド

**form_tagメソッドは、フォームに入力されたデータを送信することができる。**
「form_tag(送信先のURL) do」のように送信先のURLを指定し、そこにデータを送信する。

```erb:posts/new.html.erb
<%= form_tag("/posts/create") do %>
  <textarea name="content"></textarea>
  <input type="submit" value="投稿">
<% end %>
```

**name属性を指定したフォームに入力されたデータは、コントローラのアクション内で受け取ることができる。**
フォームのデータは変数paramsで受け取る。
paramsはname属性に設定した文字列をキーとしたハッシュになっている。

```rb:posts_controller.rb
def create
  params[:content]
end

#textareaでhogehogeと打って投稿ボタンを押すと、params[:content]にはhogehogeというデータが入ってくる
```


# redirect_toメソッド

redirect_toメソッドは、他のURLに転送することができる。
「redirect_to("URL")」とすることで、そのページに転送することができる。

```rb:posts_controller.rb
def create
  redirect_to("/posts/index")
end
```