Closed14

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 ダミーデータを作成できる

https://github.com/faker-ruby/faker

pry-byebug デバックの効率化 development

  • コンソールでデータの値を確認することができる
  • どこまで動いていて、どこが動いていないかを探す

https://github.com/deivid-rodriguez/pry-byebug

htmlit hamlより早いらしい

https://github.com/k0kubun/hamlit

erb2haml haml変換 development

https://github.com/dhl/erb2haml

Annotate データベースのスキーマをモデルに記録 development

https://github.com/ctran/annotate_models

Rubocop Linkツール development,test

rubocop.ymlを追加

https://github.com/rubocop/rubocop

Better Errors デバックの効率化 development

https://github.com/BetterErrors/better_errors

binding_of_caller デバックの効率化 development

https://github.com/banister/binding_of_caller

devise ログイン機能

https://github.com/heartcombo/devise
  • ja.yml

https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml

ransack 検索機能

https://github.com/activerecord-hackery/ransack

dotenv 環境変数を設定

https://github.com/bkeepers/dotenv

ActiveDecorator Modelを簡潔にする

Viewで使用するメソッドを定義する

https://github.com/amatsuda/active_decorator

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のリレーション(記事とユーザの関係)

  1. migrationファイルを作ってカラムを追加する
# migrationファイル
add_reference :articles, :user
  1. 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

画像アップロードの仕組み

  1. ブラウザから画像を選択し、サーバーに送られる
  2. ストレージに保存される
# migrationファイルを作成する
> rails active_storage:install

# profile.rb
has_one_attached :avator

いいね機能の実装 n対n

中間テーブルを作る

デプロイ herokuとAWSの設定

  1. 画像をアップロードするためにクラウドストレージの設定
  2. データベースの設定

aws-sdk-s3 AWSの設定

# Gemfile
gem 'aws-sdk-s3', require: false
  • Procfileの作成
  • app.jsonの作成

※herokuのサポートしているRubyのバージョンに気をつける

https://devcenter.heroku.com/articles/ruby-support#supported-runtimes

ActionText

  • 不要になるcontentカラムを削除

フォロー機能 n対n

  • 中間テーブルを作る
  • ID名を変える following_idとfollower_id
  • 外部キー テーブルの関連性をを作るための値

Ajax

  1. WebブラウザがWebサーバーにJSでリクエストを送る
  2. Webサーバーが処理をして、Webブラウザにレスポンスを返す

RubyはWebサーバーで動いていて、JSはWebブラウザで動いている。
つまり、AjaxにはAPIが必要。

  • npm
    JavaScriptのライブラリを管理するためのもの

  • yarn
    npmの親戚のようなもの

  • webpack
    モジュールパンドラと呼ばれている。
    複数のJavaScriptファイルを1つのファイルに出力してくれる。

  • webpacker
    webpackのRails版

  • axios
    非同期でHTTP通信ができる

https://github.com/axios/axios
  • postリクエストはrails-ujsを使う
    csrfTokenを発行してくれる

https://github.com/rails/rails-ujs
このスクラップは2021/09/23にクローズされました
作成者以外のコメントは許可されていません