Open12

Rails攻略

Takayuki TooyamaTakayuki Tooyama

環境構築

# 新規railsプロジェクト作成
rails new プロジェクト名

# バージョン指定
rails _5.2.1_ new プロジェクト名

エラー対処

  1. Gemfileのsqliteのバージョンを指定
  gem 'sqlite3', '~> 1.3.6'
  1. データベース作成
  rails db:create
Takayuki TooyamaTakayuki Tooyama

 

Controller

  • リクエストやレスポンスを制御
  • ViewとModelの橋渡し
     

Controller作成

  • コントローラ名は基本的には複数形(usersやpostsなど)

  • データベースと直接紐付かない場合は単数形(homeやinfoなど)

  • アクション名はクラス内に書かれているメソッドの名前

  • コントローラクラスに定義するメソッドのことをアクションと言う

# rails g controller コントローラ名 アクション名
rails g controller users index

 

Controllerの値をViewに渡す

  • インスタンス変数にすることによってViewに渡すことができる
app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @num = 10 + 1
  end
end
app/views/users/index.html.erb
<p>
  <%= @num %>
</p>
Takayuki TooyamaTakayuki Tooyama

View

画面表示を行う
 

規約

app/views/users/index.html.erb
↓
app/views/コントローラ名/アクション名.html.erb

 

ERB

  • Embedded RuByの略
  • htmlの中に、rubyのプログラムを埋め込むことができる
  • テンプレートエンジン
# この中はrubyの世界
<%= %>
# =が付くことで値を表示できるようになる
Takayuki TooyamaTakayuki Tooyama

model

データベースアクセスなどデータ関連処理を行う
 

model作成

# rails g model モデル名 カラム名:データ型
rails g model User name:string age:integer

# データベースに変更を反映
rails db: migrate

 

主なデータ型

  • integer・・・整数
  • float・・・小数
  • string・・・文字列
  • text・・・長い文字列
  • boolean・・・真偽値
     

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

# rails g migration ファイル名
rails g migration add_image_name_to_users

 

モデルクラスの定義

app/models/users.rb
class User < ApplicationRecord
  # Userクラスを定義できる
end

 

DBコマンド操作

# データベースをコマンドで操作できるようになる
rails dbconsole

# テーブル一覧を表示
. tables

# DB構造を確認
# .schema モデル名
.schema users

# 終了
.q
Takayuki TooyamaTakayuki Tooyama

form_with

  • form_tagやform_forは非推奨となったため今後はform_withを使う

関連するモデルがない場合(旧 form_tag)

<%= form_with url: users_path do |form| # urlを渡している %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>

関連するモデルがある場合(旧 form_for)

<%= form_with model: @user do |form| # modelを渡している %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>

https://qiita.com/snskOgata/items/44d32a06045e6a52d11c
 

local: trueとは

  • local: false = 非同期通信(Ajaxによる通信)が行われる。
  • local: true = 非同期通信をキャンセルし、HTMLとしてフォームの送信が可能になる。
<%= form_with(model: @user, local: true) do |f| %>

 

ストロングパラメータ

  • フォームから送られてきた特定のデータのみを受け付けるようにする
  • 意図しない(安全では無い)データの登録・更新を防いでくれる
params.require(:question).permit(:name, :title, :content)
# params = フォームから送られてきたデータ
# require(:question) = その中のquestionデータ
# permit(:name, :title, :content) = そのうちのname, title, contentのみを受け付ける
#   → name属性が"question[name]", "question[title]", "question[content]"だけ受け付ける

 

byebugの使い方

  • フォームから送信されたデータを確認することができる
 private
    def question_params
      byebug
      params.require(:question).permit(:name, :title, :content)
    end

https://qiita.com/ozackiee/items/f100fd51f4839b3fdca8

Takayuki TooyamaTakayuki Tooyama

エラーメッセージの表示

application.html
...
<% if flash[:notice] %>
  <p class="text-danger"><%= flash[:alert] %></p>
<% end %>
<%= yield %>
...
Takayuki TooyamaTakayuki Tooyama

find, find_by, whereの違い

データの取得方法

find

  • 主キーに対応するレコードを取り出す
  • 主キーを複数指定することも可能
  • 主キーが1つでも見つからない場合ActiveRecord::RecordNotFound例外が発生する

find_by

  • 与えられた条件にマッチするレコードのうち最初のレコードだけを返す
  • 条件を複数指定することができる
  • 与えられた条件がない場合nilを返す

where

  • 与えられた条件にマッチするレコードをすべて返す。
  • NOT条件
  • AND条件
  • OR条件
  • 条件にマッチしない場合は空の配列を返す

https://qiita.com/nakayuu07/items/3d5e2f8784b6f18186f2