コントローラーとアクション
リクエストを処理します。
「コントローラーとアクション」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。
コントローラとは
コントローラはルータからリクエストを受け取り、処理を行って、何を返すかを決定します。モデルとビューの間を調整する役割を担います。
- コントローラは
app/controllersに配置します。 ApplicationControllerを継承します。- 各publicメソッドがアクションになります。
コントローラの定義
コントローラは、名前が Controller で終わるクラスです。規約により、ArticlesController は articles リソースのルートを処理します。
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
endアクションとルートの対応
RESTルート7つのそれぞれが、対応するアクションを呼び出します。ルータは GET /articles を index に、GET /articles/1 を show に送り、以降も同様に処理します。規約に合わせてアクション名を付けると、すべてが自動的に接続されます。
paramsハッシュ
リクエストデータは params に渡されます。これは、ルートのセグメント、クエリ文字列、フォームのフィールドを保持するハッシュに似たオブジェクトです。/articles/5 の場合、params[:id] は "5" になります。
def show
@article = Article.find(params[:id])
endビューへのインスタンス変数
コントローラはインスタンス変数(@ 接頭辞)を通じてビューにデータを渡します。アクションで設定した @variable は、対応するビューテンプレートから参照できます。
def index
@articles = Article.all
# @articles is available in index.html.erb
endindexとshowの実装
読み取りアクションは単純です。index はコレクションを読み込み、show はIDで1件のレコードを読み込みます。その後、それぞれのデフォルトテンプレートをレンダリングします。
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
def show
@article = Article.find(params[:id])
end
endcreateの実装
create アクションは、送信されたデータからレコードを作成して保存します。成功した場合はリダイレクトし、失敗した場合はフォームを再度レンダリングして、ユーザーがエラーを修正できるようにします。
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render :new, status: :unprocessable_entity
end
endredirect_toとrenderの違い
この2つは、動作が大きく異なるレスポンスです。
redirect_toは、別のURLへの新しいリクエストをブラウザに行わせます。renderは、現在のリクエストに対してビューを直接返します。
書き込みに成功した後はリダイレクトし、フォームをエラー付きで再表示するときはrenderを使います。
Beforeアクション
before_action は、指定したアクションの前に共通の準備処理を実行し、重複を減らします。show、edit、update、destroy で必要なレコードを読み込む処理が、よくある利用例です。
class ArticlesController < ApplicationController
before_action :set_article, only: [:show, :edit, :update, :destroy]
private
def set_article
@article = Article.find(params[:id])
end
endフィルタと認証
before_action でルールを適用することもできます。before_action :require_login のようなガードは、ユーザーがサインインしていない場合に redirect_to login_path を実行してアクションを中断し、コントローラ全体を一度に保護できます。
before_action :require_login
private
def require_login
redirect_to login_path unless current_user
endレコードが見つからない場合の処理
find でレコードが見つからない場合、RecordNotFound が送出され、Railsは本番環境で404レスポンスに変換します。rescue_from を使ってこの動作をカスタマイズし、ユーザーにわかりやすいページを表示することもできます。
rescue_from ActiveRecord::RecordNotFound do
redirect_to articles_path, alert: "Not found"
end理解度チェック
コントローラについての理解度を確認します。
復習:コントローラとアクション
コントローラがリクエストを処理する方法を学びました。
- 規約により、アクションはルートに対応付けられます。
paramsはリクエストデータを保持し、@variablesはビューに渡されます。createは保存後にリダイレクトするか、フォームを再度レンダリングします。redirect_toとrenderは異なる目的で使用します。before_actionは共通の準備処理を行い、認証を適用します。
次は、Strong Parametersでマスアサインメントを安全に扱います。
よくある質問
「コントローラーとアクション」レッスンは無料ですか?
はい。「コントローラーとアクション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。
「コントローラーとアクション」で何を学びますか?
リクエストを処理します。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Ruby Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「コントローラーとアクション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このRuby Academyレッスンでコードを書いて実行できますか?
はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ルートとリソース
- コントローラーとアクション
- Strong Parameters
- ビューとレンダリング