本文へスキップ
Typle
ログイン状態を確認中

プログラミング · Ruby on Rails · Ruby

Railsメソッドのタイピング練習

Ruby on Rails 8 のメソッドと書き方44個を、初級・中級・上級の3つのリストで打って覚えます。ApplicationRecord のモデル、params.require、resources でのルーティングなどを練習できます。

3リスト・44語

無料・ログインなしで練習できます。押すとこのパックをフォローし、すぐに練習が始まります。

収録している言葉

Railsメソッド(初級)

打つ言葉意味・補足
class User < ApplicationRecord; endRails 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: :createdrender json / status:JSON応答(アクション内。必要な属性に限定)
redirect_to users_path, status: :see_otherredirect_to / head:転送・本文なし応答(1アクションで複数応答しない。redirect_toは自動returnではない)
head :no_contentredirect_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_alldestroy / delete_all:削除(destroyはcallback等。delete_allは通常callback・dependent処理を通さない)
bin/rails generate model Note title:stringgenerate / migrate / routes / test:開発コマンド(生成・DB変更を含む。既存プロジェクトで実行)
bin/rails db:migrategenerate / migrate / routes / test:開発コマンド(生成・DB変更を含む。既存プロジェクトで実行)
bin/rails routesgenerate / migrate / routes / test:開発コマンド(生成・DB変更を含む。既存プロジェクトで実行)
bin/rails testgenerate / migrate / routes / test:開発コマンド(生成・DB変更を含む。既存プロジェクトで実行)

Railsメソッド(中級)

打つ言葉意味・補足
Rails.application.routes.draw do; resources :users; endresources: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]); endparams / expect:許可した入力を取得(Rails 8の例。Strong Parametersは入力の業務検証・認可を代替しない)
validates :name, presence: true; validates :email, uniqueness: truevalidates:値を検証(モデル内。一意性の競合防止には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); endwith_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]; endonly / 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]); endbefore_action:事前処理(コントローラー内。ユーザー権限で取得範囲を制限)
rescue_from ActiveRecord::RecordNotFound do; render json: { error: 'not found' }, status: :not_found; endrescue_from:例外を応答へ変換(コントローラー内。全Exception等を一律に握りつぶさない)
class User < ApplicationRecord; has_many :posts; end; class Post < ApplicationRecord; belongs_to :user; endbelongs_to / has_many:関連を定義(外部キーはマイグレーションで設定)
after_commit :notify_created, on: :create; private; def notify_created; Rails.logger.info('created'); endafter_commit:確定後の副作用(モデル内。外部通信の再試行等はJob化を検討)
User.exists?(email: 'pomo@example.com'); User.where(active: true).count; Post.group(:user_id).countexists? / 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'); endtransaction:まとめて確定(例外でDB取引をロールバック。外部副作用は戻らない)
class CreateNotes < ActiveRecord::Migration[8.0]; def change; create_table :notes do |t|; t.string :title, null: false; t.timestamps; end; end; endcreate_table:表作成(検証後にrails db:migrate)
add_index :users, :email, unique: true; add_reference :posts, :user, foreign_key: trueadd_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等の既存テスト環境が必要)

ほかの公式パックを見る