Scaffoldで高速開発! (4/4)
作成:2012-10-14 15:32
更新:2012-10-14 15:32
更新:2012-10-14 15:32
■各アクションのポイントをチェック!
では、Scaffoldで自動生成された機能はどのような形で処理を実装しているのでしょうか。それぞれのアクションごとにポイントを整理しておきましょう。
・index レコードのリスト表示
メインページでは、レコードの内容が一覧表示されています。これはindexアクションとして処理が実装されています。以下のような感じです。
@members = Member.allで全レコードを取得し@membersというインスタンス変数に代入しています。その後にある「respond_to」というのは、フォーマットに応じて異なるテンプレートを使うための仕組みです。ここではHTMLフォーマットが指定されればindex.html.erbを、JSONフォーマットであればJSON形式でレンダリングした内容をそれぞれ送るようにしています。
・new/create レコードの作成
newでは、新規作成のフォームに表示をするだけです。@member = Member.newでインスタンスを作成し、indexで行なったようにrespond_toでHTMLやJSONフォーマットに対応させています。
実際にレコードを保存するcreateでは、@member = Member.new(params[:member])で送信されたフォームの内容をもとにインスタンスを作成し、saveを行います。このsaveが正しく行われたかどうかで、respond_toのフォーマットの表示を変えています。(saveが正しく行われるかどうかというのは、バリデーションという検証処理によってチェックされます。このへんは改めて説明する予定です)
・edit/update レコードの更新処理
editでは、@member = Member.find(params[:id])で送られたIDパラメータの値を使ってレコードを検索し、@memberに設定しています。ビュー側では、このインスタンスをもとに値が各フィールドに設定されるのですね。
POST送信されると、@member = Member.find(params[:id])でインスタンスを取得し、@member.update_attributes(params[:member])という文でレコード内容のアップデートを行います。この「update_attributes」というメソッドは、引数に指定されたハッシュの内容をもとにレコード内容を更新する働きがあります。respond_toは、既にお馴染みの処理ですね。
・destroy レコードの削除
これもupdateなどと似たような処理ですね。@member = Member.find(params[:id])でパラメータの値を元にレコードを検索し、@member.destroyで削除します。
――よく見ると、基本的にはall、find、save、destroyといったごく基本的なメソッドの組み合わせによって処理が作成されていることがわかるでしょう。Scaffoldで作成されるのは、このようにごく基本的なメソッドによる簡単な処理だけなのです。
シンプルな処理ですが、基本的な機能は一応実装されていますから、これをもとに自分なりに内容をカスタマイズするのは比較的容易です。「ScaffoldでCRUDの基本を作り、これをベースにカスタマイズしていく」というアプローチは、基本的なWebアプリ作成の一番の早道じゃないでしょうか。
・index レコードのリスト表示
メインページでは、レコードの内容が一覧表示されています。これはindexアクションとして処理が実装されています。以下のような感じです。
@members = Member.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @members }
end
@members = Member.allで全レコードを取得し@membersというインスタンス変数に代入しています。その後にある「respond_to」というのは、フォーマットに応じて異なるテンプレートを使うための仕組みです。ここではHTMLフォーマットが指定されればindex.html.erbを、JSONフォーマットであればJSON形式でレンダリングした内容をそれぞれ送るようにしています。
・new/create レコードの作成
newでは、新規作成のフォームに表示をするだけです。@member = Member.newでインスタンスを作成し、indexで行なったようにrespond_toでHTMLやJSONフォーマットに対応させています。
実際にレコードを保存するcreateでは、@member = Member.new(params[:member])で送信されたフォームの内容をもとにインスタンスを作成し、saveを行います。このsaveが正しく行われたかどうかで、respond_toのフォーマットの表示を変えています。(saveが正しく行われるかどうかというのは、バリデーションという検証処理によってチェックされます。このへんは改めて説明する予定です)
・edit/update レコードの更新処理
editでは、@member = Member.find(params[:id])で送られたIDパラメータの値を使ってレコードを検索し、@memberに設定しています。ビュー側では、このインスタンスをもとに値が各フィールドに設定されるのですね。
POST送信されると、@member = Member.find(params[:id])でインスタンスを取得し、@member.update_attributes(params[:member])という文でレコード内容のアップデートを行います。この「update_attributes」というメソッドは、引数に指定されたハッシュの内容をもとにレコード内容を更新する働きがあります。respond_toは、既にお馴染みの処理ですね。
・destroy レコードの削除
これもupdateなどと似たような処理ですね。@member = Member.find(params[:id])でパラメータの値を元にレコードを検索し、@member.destroyで削除します。
――よく見ると、基本的にはall、find、save、destroyといったごく基本的なメソッドの組み合わせによって処理が作成されていることがわかるでしょう。Scaffoldで作成されるのは、このようにごく基本的なメソッドによる簡単な処理だけなのです。
シンプルな処理ですが、基本的な機能は一応実装されていますから、これをもとに自分なりに内容をカスタマイズするのは比較的容易です。「ScaffoldでCRUDの基本を作り、これをベースにカスタマイズしていく」というアプローチは、基本的なWebアプリ作成の一番の早道じゃないでしょうか。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※indexメソッド
def index
@members = Member.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @members }
end
end
※new/createメソッド
def new
@member = Member.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @member }
end
end
def create
@member = Member.new(params[:member])
respond_to do |format|
if @member.save
format.html { redirect_to @member, notice: 'Member was successfully created.' }
format.json { render json: @member, status: :created, location: @member }
else
format.html { render action: "new" }
format.json { render json: @member.errors, status: :unprocessable_entity }
end
end
end
※edit/updateメソッド
def edit
@member = Member.find(params[:id])
end
def update
@member = Member.find(params[:id])
respond_to do |format|
if @member.update_attributes(params[:member])
format.html { redirect_to @member, notice: 'Member was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @member.errors, status: :unprocessable_entity }
end
end
end
※destroyメソッド
def destroy
@member = Member.find(params[:id])
@member.destroy
respond_to do |format|
format.html { redirect_to members_url }
format.json { head :no_content }
end
end
※関連コンテンツ