IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

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

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート 

第26回 赤い繭 2013年8月

 国語の授業で何故か印象深く筆者の記憶に長く留まっている物語があります。
 教科書に載っていた安部公房の短編小説で「赤い繭」というお話です。
 今回のコラムで取りあげる話題を模索していると、この物語が浮かび上がり脳裏に張り付いたのです。その『赤い繭』が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" class="new_person" 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" class="edit_person" id="edit_person_1" method="post">
  |      <input name="_method" type="hidden" value="patch" />

 この機能により新規画面と更新画面で入力フォームが共通化出来ることで部分テンプレートとして使えることが利点となり得ます。

主人公の「おれ」には帰る「家」がない。忘れてしまったかもしれない自分の「家」を探して「おれ」は彷徨する。しかし、すべてが誰かの「物」であり、みんなの「物」であり、もしくは、誰かの「物」になろうとしているので、自分の「物」になるものがない。帰る場所がない「おれ」は 休むことが許されず、歩き続けなければならないのだ。
予定されていたかの様なきっかけで自分の片足がほぐれはじめてしまう。
歩き続けなければならない「おれ」は歩くことが出来なくなる。
途方に暮れてしまう「おれ」はその間にもほぐれ続けていき「おれ」が消滅して「繭」となる。出来たばかりの空っぽの「繭」を夕日が赤々と染上げる。
繭の中で時間は止まり内側から夕焼けの色に赤く光りつづけている。
「おれ」が「物」となることで帰る「家」ができたのだ。
しかし、今度はその「家」に帰っていく「おれ」が居ない。

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

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

 次回もお楽しみに。

 >> CTC教育サービス HOME

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート