はとのーと

エジソンノート(アイデア、思い付き、メモ)として使っています。誰かの役に立つかもしれないので公開しています。

Railsについてのメモ

(2023-11-02更新)

Ruby on Railsについての自分用メモです。

ルーティング

config/routes.rb に記入する。

リソース全体を登録するには resoures :books のように書く。

限定、除外するにはそれぞれ only, except をつける。

resources :books, only: [:index, :show]
resources :authors, except: [:destroy, :update]

ルーティングの確認方法:

  • Rails コンソールから rails routes を実行
  • http://localhost:3000/rails/info/routes にアクセス

ActiveRecord で最終 n 件を取得する

Books.all.order(name: 'DESC').limit(5)

結果は降順で取得される (order は1度しか指定できないため)。

昇順で取得したい時はサブクエリを使って次のようにする。

Books.all.order(:name).where(id: Books.all.order(name: 'DESC').limit(5).select(:id))

その他

  • bundlerでgroup :production以外をインストールする: bundle install --without production
  • サンドボックスでコンソールを開く: rails console --sandbox
  • 特定の環境用にコンソールを開く: rails console --environment {環境}
  • generate: rails generate controller StaticPages home help, rails generate model User name:string email:string
    • コントローラやリソースは複数形、モデルは単数形で指定する
    • rails generate modelするとマイグレーションファイルが作成されるので、中身を確認してから rails db:migrate を実行してデータベースに反映させる
  • generateを取り消す: rails destroy model User (Qiita)
  • モデルでハッシュ化したパスワードを使う: モデル内にhas_secure_passwordを入れる。テーブルのpassword_digestに格納される
  • assertion:
    • レスポンスコード: assert_response :success (doc)
    • テンプレートの使用: assert_template "users/new"
    • 要素が存在する: assert_select "title", "Sign up", assert_select "div#message" (Qiita)
    • 要素が存在しない: assert_select "title", false, "Sign up", assert_select "div#message", false (APIdock)
    • 状態に変更がない: assert_no_difference "User.count" {ブロック}
    • 状態に変更がある: assert_difference "User.count", 1つ増える→assert_difference "User.count", 1
  • flashflash.now:
    • フラッシュメッセージを表示する。flash[:notice]="message", flash.now[:alert]="message"のように使う (Qiita)
    • flash:
      • 主にredirect_toメソッドとセットで使用する
      • 次のアクションまでメッセージが残る
      • 注意: renderで使うとrenderの次のアクションのページにもメッセージが残る
    • flash.now:
      • 主にrenderとセットで使用する
      • 次のアクションに移行した時点でメッセージは消える
      • 注意: redirect_toとともに使うとメッセージが表示されない (redirect_toが次のアクションとなるため)
  • debugger
    • debuggerを記入するとデバッグセッションが開始される (Zenn)
    • next(またはn)でシングルステップ実行
    • continue(またはc)で実行を再開し、quit(またはq)で実行を中断する。
  • ActiveRecord
    • update_attribute: 単一アトリビュートを更新する。バリデーションは実行されない
    • update_attributes: 複数アトリビュートを更新できるがバリデーションが実行される
  • db:migrate
    • 基本操作はrails generate migration 〜(マイグレーション作成)→rails db:migrate(適用)
    • 最後に適用したものを戻す: rails db:rollback
    • 現在の適用状況を見る: rails db:migrate:status
    • 最初から適用し直す: rails db:migrate:reset
    • マイグレーションファイルの作成:
      • モデル作成時: rails generate model User name:string email:string
      • フィールドの追加: rails generate migration add_password_digest_to_users password_digest:string
      • 固定小数点フィールドはt.decimal :fieldname, precision: 11, scale: 3のように作成する (この場合全11桁のうち小数点以下3桁)
  • db:seed
    • db/seeds.rbファイルで初期値を設定する
    • 初期値の投入はrails db:seed
    • 複数回実行するとデータが複数回追加されたりIDを指定している場合には重複の問題があるためrails db:migrate:resetでデータベースを作り直してから実行する方がよい
  • Railsバージョンアップ: Gemfileのバージョンを変更し、bundle update railsを実行 (Qiita)