Ruby on Rails5 速習してみた

##最初に
今までにWebフレームワークとしてDjangoやSpringBoot、Bubble(ノーコード)は使ったことがあったのですが、Ruby on Railsは触ったことがなく、興味本位で学習してみました。
Ruby on Rails5に入門した印象は、直感操作でシンプルに実装できるということです。個人的にはノーコードとDjangoの間を感じました。DB操作などもRailsからとても簡単にできたり、文法はわかりやすいですが、独自のルールがあったりして慣れればとても省エネでコードを書き進められそうです。
まだRailsに入門したてですが書いていて楽しいのは間違いないです。どんどん触ってみたいと思いました。

-----

####コンソール系

**アプリ作成**

```
rails new アプリ名
```

rails new (アプリ名)でアプリ名のフォルダ作成が作成され、そのフォルダ内に開発に必要なフォルダやファイルなどが作成される。

:::note info
.gitも自動で作成される
:::

**サーバー起動**

```
rails server
```

Railsサーバーの起動(デフォルトのポート番号は3000)
serverはsに省略可能

**ruby実行環境**

```
rails console
exit
```

rails環境を読み込んだ状態でrubyコードを実行できるので、直接データの作成をしたり、メソッドを試したりできる。
exitで終了する。
consoleはcに省略可能

**コントローラ作成**

```
rails generate controller コントローラー名 アクション名
```

ルーティングの追加、コントローラファイル、ビューファイルが自動生成される。
generateはgに省略可能

:::note warn
同名のコントローラを作成できないので、アクションの２個目以降は直接コントローラやビューフォルダに追加していく必要がある。
:::

**モデル作成**

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

モデルを作成する（カラム名：データ型は複数記載可能）
(例)rails g model User name:string email:string

:::note info
モデル名は単数形かつ一番最初は大文字で記載する
:::

**マイグレーションファイル作成**

```
rails g migration ファイル名
```

マイグレーションファイルを作成する

**マイグレーション反映**

```
rails db:migrate
```

**Gemfile適用**

```
bundle install
```

Gemfileを更新した際に適用する

------


####ルーティング

```ruby:/config/routes.rb
get "home/about" => "home#about"
get "/" => "home#top"
post "users/:id/create" => "users#create"
```

get(post) URL コントローラー名#アクション名で指定のアクションへルーティングする。
:id(htmlのname属性と一致する必要がある)とすると、アクション内でパラメーター(params[:id])が使用できる。
postはデータベースを変更する場合とsessionの値を変更する場合に使用



####DB操作

```ruby:
#全件取得
@hoge = Hoge.all

#一件取得
@hoge = Hoge.find_by(id: params[:id])

#複数件取得
@hoges = Hoge.where(huga_id: @huga.id)

#カウント
@Hoges = Hoge.where(huga_id: @huga.id).count

#新規作成
@user = User.new(name: params[:name], email: params[:email])
@user.save

#削除
@user = User.find_by(id: params[:id])
@user.destroy
```

:::note info
params[:〇〇]でパラメタ取得(取得した値はstring型)
変数前に@をつけることでビューファイルやアクションで値を使用できる
:::



####コントローラ

```ruby:/controllers/hoges_controller.rb
# ApplicationConrtollerを継承しているので
# 共通処理はapplication_controller.rbに記載する
class HogesController < ApplicationController
  def create
  end
end
```

```ruby:controller.rb
# 一番最初に実行されるアクションを指定できる
# "before_action :アクション名"で全てのアクションを指定
# onlyでアクション(複数)の指定可能
before_action :アクション名, {only: :アクション名}
before_action :アクション名, {only: [:アクション名1, :アクション名2]}
```

```ruby:controller
# saveメソッドは返り値が真偽値なのでif文に組み込める
if @hoge.save
  # sessionの作成
  session[:hoge_id] = @hoge.id
  # フラッシュメッセージの作成
  flash[:notice] = "データベースへ登録しました"
  # 他のurlに転送
  redirect_to("/hoges/#{@hoge.id}")
else
  # 他のビューファイルに転送
  render("hoges/new")
end
```

:::note info
sessionはページを移動してもユーザー情報を保持し続けるために用い、代入された値は、ブラウザに保存される。session[:キー名]=nilを代入するまで、保持される。
:::

:::note info
redirect_toはURLを指定する・・・redirect_to("URL")
renderはビューファイルを指定する・・・render("フォルダ名/ファイル名")
※先頭の"/"の有無に注意
renderとredirect_toと違って、アクション内で定義した@変数を指定したビューファイルでそのまま使用できる。(renderで指定したファイルのアクションで同じ@変数が定義されている必要あり)
:::



####ファイルの扱い

```ruby:controller.rb
image = params[:image]
File.binwrite("ファイルパス(public/フォルダ名/ファイル名)", image.read)
end
```

```erb:html.erb
<!-- ファイルやcsvを送る際はmultipartが必要 -->
<%= form_tag("URL", {multipart: true}) do %>
  <p>画像</p>
  <input name="image" type="file">
  <input type="submit" value="保存">
<% end %>
```

####モデル
インスタンスメソッドはモデルに記載

```ruby:
# gem 'bcrypt'を使用するとパスワードをハッシュ化できる
has_secure_password

#バリデーションの設定
#必須項目
validates :name, {presence: true}
#重複禁止
validates :email, {uniqueness: true}
#最大文字数
validates :content, {length: {maxinum: 140}}
#複数記載可能
validates :hoge, {presence: true, uniqueness: true}

#インスタンスメソッドはモデルに記載
def hoge
return Hoge.where(user_id: self.id)
end
```

####埋め込みruby(html.erb)

```erb:
<% @hoges.each do |hoge| %>
  <img src="<%= "/hoge_images/#{hoge.image_name}" %>">
  <%= link_to(hoge.name, "/hoges/#{hoge.id}") %>
<% end %>

<!-- link_toにhtmlを埋め込みたい場合は以下 -->
<%= link_to(hoge.name, "/hoges/#{hoge.id}") do %>
  <p>hogehoge</p>
<%= end %>

```