Ruby on Rails　初歩

# Ruby on Rails 初歩
MVCに沿った初歩的なことを学習した。

参考：Progate  Ruby on Rails

* この記事を読むにあったって必要になりそうな知識
    * HTMLの知識
    * Ruby基礎
    * SQLの基礎

## プロジェクト作成

```
#プロジェクト作成
$rails new アプリケーション名前


#サーバーを立ち上げる localhost:???? でアクセス
$rails sever 


#コントローラを作成する
#rails generate controller コントローラ名 アクション名
$rails generate controller home top

            
            #localhost:????/home/top   
            #コマンドによってページが自動生成される
```





##Controller

アプリケーション名/app/controller/controller.rb


```Homecontrollers.rb
class HomeController < ApplicationController

  def top
  end

end

```

アプリケーション名/config/routes.rb

```routes.rb
Rails.application.routes.draw do

 get"home/top" => "home#top"
     #URL           コントローラー名＃アクション名
end
```

##実際に使用する
localhost:????/ranking　にアクセスを行えるようにする

遷移先にrankingを作ってみる
つまり
localhost:????/ranking　でアクセスを行えるようにURL遷移をさせる処理の記述をしてみる


```Homecontrollers.rb
class HomeController < ApplicationController

  def top
  end

  #対応するルーティング、アクションを追加 ここではranking
  def ranking 
  end

end

```
##ルーティングを表にするとこんな感じになります。

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


```routes.rb
Rails.application.routes.draw do

 get"home/top" => "home#top"

#     URL    コントローラー名＃アクション名 
get"ranking" => "home#about"


end
```


##View
html.erbで記述をする
Rubyをhtml.erbに記述する方法
感想：原則は使わないほうがいい？コードの可視性が悪くなるかも


例：リストをループさせる

```html.erb
<%
lists = [
        "good",
        "bad"
]
%>


<% lists.each do|list|% >

   <div class="list">
     <% list %>
   </div>
<% end %>

```

###Controllerに変数を格納して実行する場合


```Homecontrollers.rb
class HomeController < ApplicationController

   #@をつけること
  def top
     @lists = [
        "good",
        "bad"
     ]
  end

end
```
```html.erb

<% @lists.each do|list|% >

   <div class="list">
     <% list %>
   </div>
<% end %>

```

##DBの準備 Model
マイグレーション　DBのがわかるコードに変換
可能であればSQL文
[SELECT, INSERT, UPDATE, DELETE ]
が書けると理解が早いかもしれないです。

```
#rails generate これ長いから g でOKです

$rails g model Post contents:text

              #Post・・・・・・・・posts usersなど複数形を作成する場合は単数形で
              #content:・・・カラム名
              #text・・・・・・・・データ型
```

上記を実行した時刻で作成される
アプリケーション名/db/migrate/yyyymmddhhmmss_create_posts.rb

中身

```posts.rb
class CreatePosts < ActiveRecord::Migration[5.0]
  def change
    create_table :posts do |t|
      t.text :content

      t.timestamps
    end
  end
end

```


##エラー
###ActiveRecord::PendingMigrationError
$rails db:migrate　を実行することでエラーは解決するかと思います。

マイグレーションファイルが存在する状態で、ページにアクセスすると
マイグレーションエラーが発生する。


##rails console　について
対話型で処理が書ける

```
$rails console

>post = Post.new(content:"test")
       #Postインスタンス生成
       #postsテーブルのcontentにtestを

>post.save 
#Postインスタンスをテーブルに保存
#DB Contentカラムに保存される

>quit　終了

```


##テーブルからデータを取り出す処理
```
$rails console
>post = Post.first
>post.content

>posts = Post.all
# SELECT "posts".* FROM "posts"

>posts[0]
 #id: 1,
 #content: "内容",
 #created_at: Thu, 29 Oct 2020 16:14:30 JST +09:00,
 #updated_at: Thu, 29 Oct 2020 16:14:30 JST +09:00>

> posts[0].content
=># "内容"
```

```Homecontrollers.rb
class HomeController < ApplicationController

   #@をつけること DBから情報を取得する
  def top
     @posts = Post.all

end
```