プログラミング · Ruby on Rails · Ruby
Railsメソッドのタイピング練習
Ruby on Rails 8 のメソッドと書き方44個を、初級・中級・上級の3つのリストで打って覚えます。ApplicationRecord のモデル、params.require、resources でのルーティングなどを練習できます。
3リスト・44語
無料・ログインなしで練習できます。押すとこのパックをフォローし、すぐに練習が始まります。
収録している言葉
Railsメソッド(初級)
| 打つ言葉 | 意味・補足 |
|---|---|
| class User < ApplicationRecord; end | Rails 8系:対象・コード例(生成済みRailsアプリを想定。User(name,email,active,age)とPost(user_id,title,published)等のDBを準備) |
| params.require(:user).permit(:name, :email) | require / permit:従来のStrong Parameters(許可前の入力をそのままmass assignmentしない) |
| render json: { id: 1 }, status: :created | render json / status:JSON応答(アクション内。必要な属性に限定) |
| redirect_to users_path, status: :see_other | redirect_to / head:転送・本文なし応答(1アクションで複数応答しない。redirect_toは自動returnではない) |
| head :no_content | redirect_to / head:転送・本文なし応答(1アクションで複数応答しない。redirect_toは自動returnではない) |
| scope :active, -> { where(active: true) } | scope:検索条件に名前(Userモデル内) |
| enum :status, { draft: 0, published: 1 } | enum:状態を定義(Post等に対応integer列が必要。メソッド名競合に注意) |
| User.where(active: true).where('age >= ?', 20) | all / where:検索条件(動的値はバインド。SQL文字列連結を避ける) |
| User.find(1).update!(name: 'New') | update / update!:属性更新(認可したレコード・属性だけ変更) |
| User.find(1).destroy! | destroy / delete_all:削除(destroyはcallback等。delete_allは通常callback・dependent処理を通さない) |
| Post.where(published: false).delete_all | destroy / delete_all:削除(destroyはcallback等。delete_allは通常callback・dependent処理を通さない) |
| bin/rails generate model Note title:string | generate / migrate / routes / test:開発コマンド(生成・DB変更を含む。既存プロジェクトで実行) |
| bin/rails db:migrate | generate / migrate / routes / test:開発コマンド(生成・DB変更を含む。既存プロジェクトで実行) |
| bin/rails routes | generate / migrate / routes / test:開発コマンド(生成・DB変更を含む。既存プロジェクトで実行) |
| bin/rails test | generate / migrate / routes / test:開発コマンド(生成・DB変更を含む。既存プロジェクトで実行) |
Railsメソッド(中級)
| 打つ言葉 | 意味・補足 |
|---|---|
| Rails.application.routes.draw do; resources :users; end | resources:RESTルート(config/routes.rb。7標準アクションを生成) |
| root 'home#index'; get '/health', to: 'health#show' | root / get:トップ・個別ルート(routes.draw内。対応コントローラーが必要) |
| def user_params; params.expect(user: [:name, :email]); end | params / expect:許可した入力を取得(Rails 8の例。Strong Parametersは入力の業務検証・認可を代替しない) |
| validates :name, presence: true; validates :email, uniqueness: true | validates:値を検証(モデル内。一意性の競合防止にはDB一意制約も必要) |
| User.find(1); User.find_by(email: 'pomo@example.com') | find / find_by:1件取得(findは対象なしで例外、find_byはnil) |
| User.order(created_at: :desc, id: :desc).limit(20).offset(40) | order / limit / offset:並べ替え・ページング(ユーザー入力の生SQLをorderへ渡さない) |
| User.where(active: true).pluck(:id, :name); User.where(id: 1).pick(:name) | pluck / pick / select:必要列だけ取得(pluckは配列。selectは選択列付きモデルのRelation) |
| User.joins(:posts).distinct; User.left_joins(:posts) | joins / left_joins:関連を結合(joins自体は関連を事前ロードしない) |
| User.preload(:posts).find_each { |u| u.posts.each { |p| puts p.title } } | includes / preload:関連のN+1を避ける(includesは条件によってJOINになる等の差) |
| User.find_each(batch_size: 500) { |u| puts u.id } | find_each:分割して処理(通常のorderで並ぶ一覧処理とは異なる) |
| user = User.new(name: 'Pomo', email: 'pomo@example.com'); user.save! | new / save / save!:作成・保存(saveは検証失敗でfalse、save!は例外) |
| User.create!(name: 'Pomo', email: 'pomo@example.com') | create / create!:生成と保存(検証・callbackが実行される) |
| User.where(active: false).update_all(name: 'Inactive') | update_all:一括更新(検証・callbackを通常通らずupdated_atも自動更新しない) |
| user = User.find(1); user.with_lock do; user.update!(active: true); end | with_lock:行ロックして処理(DB取引内で対象行をロックして更新。実データを変更する) |
| <h1><%= @user.name %></h1> <%= link_to '一覧', users_path %> | ERB / link_to:表示・リンク(通常自動HTMLエスケープ。rawやhtml_safeへ未検証入力を渡さない) |
Railsメソッド(上級)
| 打つ言葉 | 意味・補足 |
|---|---|
| resources :users, only: [:index, :show] do; resources :posts, only: [:index, :create]; end | only / member / nested:公開範囲・関連ルート(routes.drawブロック内。深すぎるネストを避ける) |
| class UsersController < ApplicationController; def show; @user = User.find(params[:id]); render json: @user.as_json(only: [:id, :name]); end; end | アクション:入力から処理・応答(認証・認可は別途。機密属性を返さない) |
| before_action :set_user, only: [:show, :update]; private; def set_user; @user = User.find(params[:id]); end | before_action:事前処理(コントローラー内。ユーザー権限で取得範囲を制限) |
| rescue_from ActiveRecord::RecordNotFound do; render json: { error: 'not found' }, status: :not_found; end | rescue_from:例外を応答へ変換(コントローラー内。全Exception等を一律に握りつぶさない) |
| class User < ApplicationRecord; has_many :posts; end; class Post < ApplicationRecord; belongs_to :user; end | belongs_to / has_many:関連を定義(外部キーはマイグレーションで設定) |
| after_commit :notify_created, on: :create; private; def notify_created; Rails.logger.info('created'); end | after_commit:確定後の副作用(モデル内。外部通信の再試行等はJob化を検討) |
| User.exists?(email: 'pomo@example.com'); User.where(active: true).count; Post.group(:user_id).count | exists? / count / sum:存在・集計 |
| User.upsert_all([{ id: 1, name: 'Pomo', email: 'pomo@example.com' }], unique_by: :id) | upsert_all:一括追加・競合更新(PostgreSQL等の対応とDB制約が前提。検証・callbackを通さない) |
| User.transaction do; user = User.create!(name: 'Pomo', email: 'tx@example.com'); user.posts.create!(title: 'Hello'); end | transaction:まとめて確定(例外でDB取引をロールバック。外部副作用は戻らない) |
| class CreateNotes < ActiveRecord::Migration[8.0]; def change; create_table :notes do |t|; t.string :title, null: false; t.timestamps; end; end; end | create_table:表作成(検証後にrails db:migrate) |
| add_index :users, :email, unique: true; add_reference :posts, :user, foreign_key: true | add_index / references:制約・索引(マイグレーション内。既存の列・索引があると重複に注意) |
| <%= form_with model: @user do |f| %> <%= f.text_field :name %> <%= f.submit %> <% end %> | form_with:フォーム(対応ルート・アクションとCSRF保護を用意) |
| class NotifyJob < ApplicationJob; def perform(user_id); Rails.logger.info(user_id); end; end; NotifyJob.perform_later(1) | perform_later:バックグラウンド処理(Jobアダプター・ワーカーの設定が必要) |
| class UserTest < ActiveSupport::TestCase; test 'name is required' do; user = User.new(name: nil); assert_not user.valid?; end; end | モデルテスト:検証する(test/test_helper等の既存テスト環境が必要) |