こんにちはuniです。
今回は「railsを学んで1週間」くらいの初学者向けの記事です。
辞書的な感じの使用を想定しています。
MVC
MVC(モデル、ビュー、コントローラ)は、webアプリケーションの設計パターン。
Model
データとその処理を担当。
モデルはアプリケーションの**データの「設計図」**とも言える。
- データベースからデータを取得したり、データを保存したりする役割がある
- データのバリデーションや操作も行う
View
ユーザーに表示される画面を担当。
- データの表示や入力フォームの表示など、ユーザーとの対話を行う
- ビューはユーザーに見える部分であり、デザインやレイアウト(スタイル)も担当
Controller
ユーザーのリクエストを受け取り、処理の調整を担当。
- ユーザーからのリクエストを受け取り、それに応じてモデルやビューを操作する
- リクエストに基づいてデータの取得や保存を行ったり、ビューの表示を指示をする
例:間違ったURLを指定したら404エラー画面を表示させる
ルーティング
- ルーティングは、URLとコントローラーのアクションとの対応関係を定義する仕組み
- ユーザーが特定のURLにアクセスした際に、どのコントローラーのどのアクションを実行するかを指定する
- ルーティングの設定によって、正しいコントローラーとアクションが呼び出され、対応するビューが表示される
- config/routes.rbファイルで設定できる
#例
Rails.application.routes.draw do
get '/users', to: 'users#index'
post '/users', to: 'users#create'
get '/users/:id', to: 'users#show'
patch '/users/:id', to: 'users#update'
delete '/users/:id', to: 'users#destroy'
end
上記の例では、/usersにアクセスした場合にはUsersControllerのindexアクションが実行される。
同様に、/users/:idにアクセスした場合にはUsersControllerの対応するアクションが実行される。
マイグレーション(Migration)
- マイグレーションは、データベースのスキーマ(テーブルやカラムの構造)を設定や変更するための仕組み
#例
class CreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.string :name
t.integer :age
t.timestamps
end
end
end
上記の例では、CreateUsersという名前のマイグレーションが作成されている。
このマイグレーションでは、users
という名前のテーブルが作成され、name
とage
というカラムが追加される。
ActiveRecord
データベースのテーブルをモデルとして扱うための機能。
Active Recordを使うことで、データベースとのやり取りを抽象化し、開発者がデータベース関連のコードを簡潔に記述できる。
# モデルの作成
class User < ActiveRecord::Base
end
# データの作成
user = User.new(name: 'John', age: 25)
user.save
# データの読み取り
user = User.find_by(name: 'John')
puts user.age
# データの更新
user.age = 30
user.save
# データの削除
user.destroy
この例では、User
という名前のモデルを作成し、データベースのusers
テーブルと関連付けている。User.new
で新しいユーザーを作成し、saveメソッド
でデータベースに保存する。
User.find_by
でデータベースからユーザーを読み取り、属性にアクセスできる。属性の値を変更してsaveすることでデータを更新し、destroyメソッド
でデータを削除する。
これらの操作はActive Recordの機能を利用して簡潔に記述できる。
アソシエーション
アソシエーションは、データベースのテーブル間の関連性を表現するための概念。
特徴は以下の通り。
- アソシエーションはActive Recordによって提供される機能
- モデル間の関係性を明確にするために使用される
- 異なるテーブル間のデータの関連を取り扱うことができる
アソシエーションは、1対1
、1対多
、多対多
の関係を表現するための異なるタイプがある。
1対1
の関係性の場合 → belong_to
メソッドを定義
1対多
の関係性の場合 → has_many
メソッドを定義
# ユーザーモデル
class User < ApplicationRecord
has_many :posts
end
# 投稿モデル
class Post < ApplicationRecord
belongs_to :user
end
上記の例は、Twitterのような投稿に関することで記述されている。
Userモデル
は複数の投稿を持つことができるため、has_many :posts
という関連付けを定義サれている。
一方、Postモデル
は1つのユーザーに所属するため、belongs_to :user
という関連付けを定義している。
このように、アソシエーションを使うことで、関連するモデル間でのデータの取得や操作が簡単になる。
データベースクエリの基本的な操作
データベースクエリの基本的な操作として、作成、読み取り、更新、削除がある。
レコードの作成(Create)
- 新しいレコードをデータベースに作成する操作
- 例:
User.create(name: "John", age: 25)
レコードの読み取り(Read)
- データベースから既存のレコードを取得する操作
- 例:
User.find(1)、User.where(age: 25)
レコードの更新(Update)
- データベース内の既存のレコードを更新する操作
- 例:
user = User.find(1)、user.update(name: "Jane")
レコードの削除(Delete)
- データベース内の既存のレコードを削除する操作
- 例:
user = User.find(1)、user.destroy
バリデーション
バリデーションは、データの妥当性や整合性を確認するための機能。
例えば「名前入力フォームに郵便番号を入れたら弾かれる。」のようなもの。
一般的なバリデーションの昨日は以下の通り。
必須フィールドの確認
特定の属性が空でないことを確認する。
例えば、ユーザー登録時、必須項目である名前
が空白だった場合、送信できないようにできる。
フォーマットの検証
データが特定のフォーマットに従っているかどうかを確認する。
例えば、郵便番号にちゃんとハイフンが入っているかなどをチェックできる。
一意性の確認
特定の属性が一意であるかを確認する。
例えば、ユーザー名や商品コードが他のデータと重複していないかどうかをチェックできる。
範囲の制限
特定のデータが特定の範囲内に収まっているかどうかを確認する。
例えば、18歳以上かどうか、価格は特定の金額以上に設定されているかなどをチェックできる。
基本的にはvalidatesメソッド
を使用してバリデーションのルールを指定する。
class User < ApplicationRecord
validates :name, presence: true
validates :email, presence: true, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
validates :age, numericality: { greater_than_or_equal_to: 18 }
end
上記の例では、ユーザーモデルのname属性
は必須であることを、email属性
は必須であり、正しいメールアドレスの形式であることを、age属性
は18歳以上であることをバリデーションしている。
もしバリデーションに違反するデータがある場合、エラーメッセージが返される。
ヘルパーメソッド
Ruby on Railsで用意されている便利なアイテム。ヘルパーメソッドを使用することで、より簡単にコードを記述し、一般的なタスクを実行することができる。
主要なヘルパーメソッド
link_to
リンクを生成するためのヘルパーメソッド。これを指定するだけでなぜか勝手に各ページのURLが生成される。神。
<%= link_to 'ホーム', root_path %>
form_for
フォームを生成するためのヘルパーメソッド。指定したオブジェクトに基づいてフォームを作成し、データの送信先や入力フィールドを自動的に生成される。好き。
<%= form_for @user do |f| %>
<%= f.text_field :name %>
<%= f.submit '保存' %>
<% end %>
image_tag
画像タグを生成するためのヘルパーメソッド。指定した画像ファイルのパスを元に、imgタグが生成される。
<%= image_tag 'logo.png' %>
number_to_currency
値を通貨の形式に変換するためのヘルパーメソッド。数値を通貨の形式で表示する際に使用する。神超えて意味不。
<%= number_to_currency(@product.price) %>
部分テンプレート
ビューの一部分を切り出して再利用するためのテンプレート。
主にヘッダーやフッターに用いられる。
ファイル形式はただのHTMLなので、他のHTMLファイル特別するために**"アンダーバー(_)"**から始まる。
#_header.html.erb
<nav>
<ul>
<li><%= link_to 'Home', root_path %></li>
<li><%= link_to 'About', about_path %></li>
<li><%= link_to 'Contact', contact_path %></li>
</ul>
</nav>
このようなヘッダーの部分テンプレートを、メインファイルの"home.html.erb"に使用すると、
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
</head>
<body>
<%= render partial: 'header' %>
<h1>Welcome to My App!</h1>
<!-- 他のコンテンツ -->
</body>
</html>
となる。
ここではrenderメソッド
を使用して_header.html.erb
を呼び出している。partialオプションに部分テンプレートの名前
を指定し、Railsが自動的に部分テンプレートを探して表示する。
CSSとSCSS
CSSは、ウェブページやアプリケーションのスタイルを設定するためのスタイルシート。
SCSSはCSSの拡張機能。
SCSSは、変数、ネスト、ミックスイン、継承などの機能を使用して、スタイルの再利用性と保守性をUPできる。
ネスト
ある要素の親子関係を意味する。
ある要素や構造が別の要素や構造の中に入れ子になることを指す。
具体的には、ある要素が他の要素の中に配置され、階層的な関係を持つことを意味する。
railsでは、ルーティングやリレーションシップ(関連付け) において、リソースやコントローラーを階層的に配置することを指す。
具体的には、ルーティングではURLパスの階層構造を作り、リソースやアクションをグループ化する。
これにより、ネストされたURLを使って特定のリソースやアクションにアクセスすることができる。
resources :users do
resources :posts
end
上記の例では、users
というリソースの中に、さらにposts
というリソースがネストされている。これにより、/users/:user_id/posts
といったURLパスが生成される。
Gem
Gem(ジェム)は、Rubyの拡張機能やライブラリを提供するパッケージのこと.
Railsアプリケーションでは、Gemを使用してさまざまな機能や機能拡張を追加することができる。
例えば、デバッグや認証、画像の処理、ユーザー管理のためのGemがある。
Gemfileの末尾にgem 'devise'
のようにGemを指定し、ターミナルでbundle install
と、Bundlerを使ってGemをインストールできる。
番外編:HTTPメソッド
プログラミング学習の基本として、HTTPメソッド
がある。
WebブラウザやWebサーバーがリクエストやレスポンスの種類を識別するためのもの。
例えば、いまユーザーはファイルを「送信」したのか。それとも「一覧を表示」したのか。など、行動を判断すること。
GETメソッド
GETメソッドは、WebブラウザがWebサーバーに情報をリクエストするためのメソッド。
Webブラウザでウェブページを表示する際に使用される。
「GETする」と覚えれば良い。
POSTメソッド
POSTメソッドは、WebブラウザがWebサーバーにデータを送信するためのメソッド。
Webフォームの内容を送信する際に使用される。
「POSTに入れる」と覚えれば良い。
PUTメソッド
PUTメソッドは、WebブラウザがWebサーバーにデータを更新するためのメソッド。
既存のデータを更新する際に使用されます。
これは無理やり覚えよう。
DELETEメソッド
DELETEメソッドは、WebブラウザがWebサーバーからデータを削除するためのメソッド。
特定のデータを削除する際に使用される。
これはパソコンの「Deleteキー」と同じ。