Open12
Rails攻略
環境構築
# 新規railsプロジェクト作成
rails new プロジェクト名
# バージョン指定
rails _5.2.1_ new プロジェクト名
エラー対処
- Gemfileのsqliteのバージョンを指定
gem 'sqlite3', '~> 1.3.6'
- データベース作成
rails db:create
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>
ルーティング
config/routes.rb
Rails.application.routes.draw do
get 'users/index'
# get 'users/index', to: 'users#index'の省略形
end
View
画面表示を行う
規約
app/views/users/index.html.erb
↓
app/views/コントローラ名/アクション名.html.erb
ERB
- Embedded RuByの略
- htmlの中に、rubyのプログラムを埋め込むことができる
- テンプレートエンジン
# この中はrubyの世界
<%= %>
# =が付くことで値を表示できるようになる
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
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 %>
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
バリデーション
エラーメッセージの表示
application.html
...
<% if flash[:notice] %>
<p class="text-danger"><%= flash[:alert] %></p>
<% end %>
<%= yield %>
...
link_to
find, find_by, whereの違い
データの取得方法
find
- 主キーに対応するレコードを取り出す
- 主キーを複数指定することも可能
- 主キーが1つでも見つからない場合ActiveRecord::RecordNotFound例外が発生する
find_by
- 与えられた条件にマッチするレコードのうち最初のレコードだけを返す
- 条件を複数指定することができる
- 与えられた条件がない場合nilを返す
where
- 与えられた条件にマッチするレコードをすべて返す。
- NOT条件
- AND条件
- OR条件
- 条件にマッチしない場合は空の配列を返す
ファイルの共通化
- ファイル名の先頭に_(アンダースコア)をつける
- <%= render 'form' %>
ここまでの学習成果
- 環境構築
- Ruby基礎
- Raisl基礎