特集・コラム

メニュー

スーパーエンジニアの独り言

vol.7 ‐ 『 Ruby on Rails 「form_forメソッド」 ~赤い繭~ 』

投稿日時:2014/04/23 01:04

カテゴリ: スーパーエンジニアの独り言

国語の授業で何故か印象深く筆者の記憶に長く留まっている物語があります。
教科書に載っていた安部公房の短編小説で「赤い繭」というお話です。
今回のコラムで取りあげる話題を模索していると、この物語が浮かび上がり脳裏に張り付いたのです。

その『赤い繭』がform_forというメソッドです。
Ruby on RailsではMVCモデルにおけるビュー(View)に相当するものとしてActionViewが
ActionPackパッケージ内で提供されており、画面表示に関する操作ができます。ActionViewの役割は
レスポンスとして送信するためにHTMLフォーマットなどで動的にページ生成することにあります。

ActionViewは、ビュー・テンプレート(View Template)というHTMLにRubyのコードを埋め込む所定の形式で
記述することで該当レンダリングエンジン(ERB)によりHTMLフォーマットに変換される仕組みです。
このビューの仕組みはJSP(JavaServer Pages)と同様なものと理解出来るでしょう。
ビュー・テンプレートを記述するには、コントローラから渡された情報を画面に動的に反映するためRubyコードを
変換してHTMLタグで出力を行う必要があります。この機能がビューにおけるヘルパーメソッドとしてHTMLタグ毎に
各種用意されており、それらはビューヘルパと呼称されます。
HTMLで複数の情報を入力して送信する画面を表示するにはform(フォーム)タグを使います。
ショッピングサイトなどで名前や住所、電話番号 を入力してくださいとブラウザ画面が表示されているのを
見たことがあるかと思いますが、そのHTMLにはformタグが使われているのです。その入力 フォームを
表示するためのビューヘルパとしてform_tagメソッドとform_forメソッドの2つがActionViewに用意されています。
通常の入力フォームにはform_tagメソッドを使えば良いのですが、もう一つのform_forメソッドはモデル(Model)に
対応した専用フォームの生成に役立ちます。
モデルは、以前の記事「空蝉」にてご紹介したActiveRecordによってデータベースを
操作して取得できるデータを表現したクラスです。
つまり、Railsアプリではモデルに関する情報をユーザ画面入力から取得してその内容をモデルに反映することで
データベースに保存出来るのです。
この処理がRailsアプリを作成する際の重要なパーツとなり多用されるため、モデルの入力フォームを
簡易に生成できると嬉しいのですが、その欲求を満たしてくれるのがform_forメソッドなのです。
以下にform_forを利用する際の典型的なサンプルを紹介します(form_forのソースコードに記載されているものです)。
新規登録する画面をイメージしていただくと良いでしょう。

  |    <%= form_for @person do |f| %>
  |      <%= f.label :first_name %>:
  |      <%= f.text_field :first_name %><br />
  |
  |      <%= f.label :last_name %>:
  |      <%= f.text_field :last_name %><br />
  |
  |      <%= f.submit %>
  |    <% end %>

該当モデルはPersonクラスで「人」を表現しています。属性情報として「苗字」と「名前」が入っているものとします。
form_forメソッドの引数にインスタンス変数(@person)が指定されています。
つまり 「Personモデルのためのフォーム(form)」となります。
インスタンス変数(@person)は、新規登録なのでPerson.newで産まれたばかりの
インスタンスで属性情報が空の状態です。
form_forメソッドはブロックを引数にとり、その中で表示するフォーム内の入力項目を記述しますが、
指定されているブロック変数は FormBuilderオブジェクトで簡略的に記載できます。
上記のコードで生成されるHTMLフォーマットが以下となります(一部割愛しています)。

  |    <form action="/people" id="new_person" method="post">
  |      <label for="person_first_name">First name</label>:
  |      <input id="person_first_name" name="person[first_name]" type="text" /><br />
  |
  |      <label for="person_last_name">Last name</label>:
  |      <input id="person_last_name" name="person[last_name]" type="text" /><br />
  |
  |      <input name="commit" type="submit" value="Create Person" />
  |    </form>

form_forメソッドの引数にPersonクラスのインスタンスを指定したことで、意図した新規登録画面での
HTMLフォームが簡易に作成できました。form_forでは、内部実装でpolymorphic_pathメソッドが呼ばれて
インスタンス変数のクラス情報を元にHTMLのフォームタグで必要な呼び出すアクション先のURLを自動的に
判断してくれます。
また、重要となる生成されるHTMLのname属性ではフォームで指定したモデル名と属性値を反映しており、
呼ばれる処理(アクション)はハッシュ形式(モデル名[属性値])で受け取ることが出来ることで
アクションの記述も簡易になります。
更なる効能としてインスタンス変数(@person)に既存のデータが入っている状態でも利用することが出来ます。
つまり、更新画面では呼び出す アクションが異なりますが、polymorphic_pathメソッドにより更新処理を行うための
適切なアクションを呼び出すHTMLとして生成してくれるのです。
以下は、Rails4での生成結果の一部です。前述と同じコードで生成していますが、
インスタンス変数の状態に依ってアクションが変更されています。
Rails4では動詞(HTTPメソッド)はPUTに加えてPATCHが追加された様子です
(経路情報辺りについてはまたいつか機会を改めて)。

  |    <form action="/people/1" id="edit_person_1" method="post">
  |      <input name="_method" type="hidden" value="patch" />

この機能により新規画面と更新画面で入力フォームが共通化出来ることで部分テンプレートとして
使えることが利点となり得ます。
主人公の「おれ」には帰る「家」がない。忘れてしまったかもしれない自分の「家」を探して「おれ」は彷徨する。
しかし、すべてが誰かの「物」であり、みんな の「物」であり、もしくは、誰かの「物」になろうとしているので、
自分の「物」になるものがない。帰る場所がない「おれ」は 休むことが許されず、歩き続 けなければならないのだ。
予定されていたかの様なきっかけで自分の片足がほぐれはじめてしまう。
歩き続けなければならない「おれ」は歩くことが出来なくなる。
途方に暮れてしまう「おれ」はその間にもほぐれ続けていき「おれ」が消滅して「繭」となる。

出来たばかりの空っぽの「繭」を夕日が赤々と染上げる。
繭の中で時間は止まり内側から夕焼けの色に赤く光りつづけている。
「おれ」が「物」となることで帰る「家」ができたのだ。
しかし、今度はその「家」に帰っていく「おれ」が居ない。

出典:安部公房「赤い繭(壁)」新潮社(1969)

「赤い繭」は、新潮文庫版の「壁」に収録されています。
機会があれば本屋さんで安部公房の本を手の中に入れてみてください。
もし、地面と直角にしっかり立てなくなってきたとしたら、あなたもほぐれはじめています。
その際は十分に御注意ください。

次回もお楽しみに。

 

バックナンバーはこちら

IT系のお仕事特集

お仕事のご紹介には、まずヒューマンリソシアへの登録が必要です。
ヒューマンリソシア人材派遣サイトの便利な機能 ・お気に入りの派遣求人のブックマーク ・登録会への予約 ・有給休暇の管理 ・WEB給与明細の確認 ・お気に入りの情報をメール受信
登録会の入力手続きをあらかじめおこなえます。

ヒューマンリソシア派遣サービスに 登録する 無料

ページトップへ戻る
ヒューマンリソシア派遣サービスに 登録する 無料
ページトップへ戻る