Railsアプリのメモ
CRUDアプリの作成。
1、アプリケーション作成。
❯ rails new <アプリケーション名> -d postgresql
# サーバー起動
❯ pg_ctl start -D /usr/local/var/postgres
2、root_pathの設定
root to: 'home#index'
3、モデルの作成
- migrationファイルでカラムの追加
- migrationを実行する
schema.rbでDBの状況を確認できる
❯ rails g model Article
❯ rails db:migrate
- seeds.rbでダミーデータを作成できる
❯ rails db:seed
MVCとは
Webアプリケーションを作る根幹の考え方
Model、Views、Controllerの関係性のこと
クライアントからリクエストが来たらroutesへ行く
↓
routesで設定されたControllerのアクションを実行する
↓
Controllerでは、Modelを介してDBとやりとりをしてデータを取得したりする
↓
データをViewsに埋め込んで、クライアントにHTMLを返す
CRUD
Create
Read
Update
Delete
Gemについて
-
Gem
ライブラリを管理するツール -
Gemfile.lock
ライブラリーのバージョンを管理するもの
Faker ダミーデータを作成できる
pry-byebug デバックの効率化 development
- コンソールでデータの値を確認することができる
- どこまで動いていて、どこが動いていないかを探す
htmlit hamlより早いらしい
erb2haml haml変換 development
Annotate データベースのスキーマをモデルに記録 development
Rubocop Linkツール development,test
rubocop.ymlを追加
Better Errors デバックの効率化 development
binding_of_caller デバックの効率化 development
devise ログイン機能
- ja.yml
ransack 検索機能
dotenv 環境変数を設定
ActiveDecorator Modelを簡潔にする
Viewで使用するメソッドを定義する
newアクションとcreateアクションを作る
strong parameterでセキュリティ対策
modelでバリデーションを設定
errors.full_messagesでバリデーションを表示
i18nで日本語をデフォルトにする
config.i18n.default_locale = :ja
ja.yml
editアクション、updateアクションを作る
destroyを作る、削除は100%行われて欲しいのでdestroy!
リファクタリング
beforeアクション、日付の表示、i18n
部分テンプレートを作る
ActiveRecordbについて
一つのレコードを取得する
- findとfind_by
findはidを指定して検索する
find_byはいろいろ指定して検索することができる
# findは例外が発生
Article.find(id: 100)
=> ActiveRecord::RecordNotFound
#find_byはnilが返ってくる
Article.find_by(id: 100)
=> nil
- first, second, thirdとlast
Article.first
Article.last
複数レコードを取り出す
- all, order, limit
# 全て取得
Article.all
# 並び替える
Article.all.order(id: :desc)
# 制限する
Article.all.limit(10)
- where, count
# 複数取得できる、配列で返ってくる
Article.where(id: 10)
# idが2より大きいものを取得
Article.where('id > 2')
Article.where('id > ?', 2)
# 何件取得出来たか
Article.all.count
レコードの作成・削除
- create, save
# 1回で作成できる
Article.create(title: 'タイトル', content: 'aaaaaaaa')
# newで値を入れる、saveで作成できる
article = Article.new(title: 'newタイトル', content: 'newnewnew')
article.save
- create!, save!
絶対に保存されいといけない場合は、! をつける
# そのまま処理が進む
Article.create(title: 'aaaaaaaa')
=> #<Article id: nil, title: "aaaaaaaa", content: nil, created_at: nil, updated_at: nil>
# ! をつけると、例外が発生する(処理が止まる)
Article.create!(title: 'aaaaaaaa')
=> ActiveRecord::RecordInvalid (バリデーションに失敗しました: 内容を入力してください)
# falseが返ってくる
article = Article.new(title: 'newタイトル')
article.save
=> false
# ! をつけると、例外が発生する(処理が止まる)
article = Article.new(title: 'newタイトル')
article.save!
=> ActiveRecord::RecordInvalid (バリデーションに失敗しました: 内容を入力してください)
- update, assign_attributes
# 値が更新される
Article.first.update(title: 'タイトルだよ')
# 一度インスタンスの値を書き換えてからsaveする
article = Article.first
article.assign_attributes(title: 'assign_attributes')
article.save
- destroy
# 削除される
Article.find(10).destroy
Railaの思想
COC(規約より制約)
- 独自ルールを排除して統一性を実現した
- Railsのルールを守れ
DRY(Don't Repeat Yourself)
- 同じコードを書くのをやめる
REST
- リソースとURLのルール
Validationについて
- length
validates :title, length: { minimum: 2, maximum: 100 }
- uniqueness
validates :content, uniqueness: true
- format
validates :title, format: { with: /\A(?!\@)/ }
- 独自のValidationを追加
validate :validate_title_and_content_length
def validate_title_and_content_length
char_count = self.title.length + self.content.length
errors.add(:content, '100文字以上で!') if char_count < 100
end
ログインの仕組み
HTTPはステートレス
クライアントはリクエストを投げ、サーバーはレスポンスを返すだけ
状態を保たないのでログインしても、状態を維持できない
cookieとsession
ログインすると、サーバーから暗号化したuser_idが返ってくる
それをcookieで保持する
処理を行う一連の流れをsessionと呼ぶ
DBのリレーション(記事とユーザの関係)
- migrationファイルを作ってカラムを追加する
# migrationファイル
add_reference :articles, :user
- Modelに変更を加える
# user.rb
has_many :articles, dependent: :destroy
# article.rb
belongs_to :user
Profileを作成 1対1
has_oneの場合は
def edit
@profile = current_user.build_profile(profile_params)
end
enumで性別を定義する
# DBではmaleが来たら0を登録する
enum gender: { male: 0, female: 1, other: 2 }
- ぼっち演算子
# profileがあればprofile.nicknameを使う、なければnilとなるので左のメソッドを使う
def display_name
profile&.nickname || self.email.split('@').first
end
- delegate
delegate :birthday, :gender, to: :profile, allow_nil: true
# 同じ意味、ゲッター、セッターのような役割?
def birthday
profile&.birthday
end
def gender
profile&.gender
end
ActiveStorage
画像アップロードの仕組み
- ブラウザから画像を選択し、サーバーに送られる
- ストレージに保存される
# migrationファイルを作成する
> rails active_storage:install
# profile.rb
has_one_attached :avator
いいね機能の実装 n対n
中間テーブルを作る
デプロイ herokuとAWSの設定
- 画像をアップロードするためにクラウドストレージの設定
- データベースの設定
aws-sdk-s3 AWSの設定
# Gemfile
gem 'aws-sdk-s3', require: false
- Procfileの作成
- app.jsonの作成
※herokuのサポートしているRubyのバージョンに気をつける
ActionText
- 不要になるcontentカラムを削除
フォロー機能 n対n
- 中間テーブルを作る
- ID名を変える following_idとfollower_id
- 外部キー テーブルの関連性をを作るための値
Helper
Viewのための場所
見た目を整える、表示させるなどの見た目に関しての処理を書く
Ajax
- WebブラウザがWebサーバーにJSでリクエストを送る
- Webサーバーが処理をして、Webブラウザにレスポンスを返す
RubyはWebサーバーで動いていて、JSはWebブラウザで動いている。
つまり、AjaxにはAPIが必要。
-
npm
JavaScriptのライブラリを管理するためのもの -
yarn
npmの親戚のようなもの -
webpack
モジュールパンドラと呼ばれている。
複数のJavaScriptファイルを1つのファイルに出力してくれる。 -
webpacker
webpackのRails版 -
axios
非同期でHTTP通信ができる
- postリクエストはrails-ujsを使う
csrfTokenを発行してくれる
letter_opener
letter_opener_web
foreman