次にモデルについてですが、StrutsではActionForm継承クラスが画面からの入力項目を格納し、内容の妥当性を検証する機能を受け持ちます。RailsではActiveRecordというコンポーネントが、同様のモデルの機能を実現しています。
StrutsのActionFormは、Java側のモデルとデータベース上のデータとを同期させる機能は有していません。対して、RailsのActiveRecordはO/Rマッピングの機能を持つため、Ruby側のモデルオブジェクトの内容をデータベース上のデータと簡単に同期することができます(O/Rマッピングについては、@ITのキーワードINDEX「O/Rマッピング」などを参考にしてみてください)。
StrutsでO/Rマッピングを実現するためには、ほかのフレームワークやライブラリとの組み合わせが必要となります。Railsは通常のWebアプリケーション開発に必要なライブラリのほとんどを標準で提供しており、「フルスタック」のWebアプリケーションフレームワークに分類されます。
ビュー(View)については、StrutsとRailsで最も共通性が高いといえる部分です。StrutsではJSPを、RailsではERBを用いてViewを記述しますが、ぱっと見にも両者の記述は非常に似ています。
JSPを使ったことのあるJavaエンジニアなら、「<% ・・・ %>」がJavaコードの実行(Scriptlet)、「<%= ・・・ %>」が評価結果の埋め込み(Expression)であることはご存じでしょう。ERBでも実は同様のタグ記述ができるようになっているので、この点においては違和感なくコードを読み進められると思います。
相違点として挙げられるのは、RailsではStrutsタグライブラリのような通常のHTMLタグに近い外観のタグは提供していないことです。Railsでは「ヘルパー」というコンポーネントで同種の機能を実現しています。ヘルパーは「<% ・・・ %>」や「<%= ・・・ %>」の内部でメソッドを呼び出して利用します。
<html:form action="authenticate"> ユーザーID: <html:text property="login_name"/> <br> パスワード: <html:password property="login_password"/> <br> <html:submit value="ログイン"/> </html:form>
<% form_tag :action => 'authenticate' do %> ユーザーID: <%= text_field_tag 'login_name' %> <br> パスワード: <%= password_field_tag 'login_password' %> <br> <%= submit_tag "ログイン" %> <% end %>
Railsのコード例にある「form_tag」「text_field_tag」「password_field_tag」「submit_tag」は、すべてヘルパーメソッドの呼び出しです。
前回の記事「JavaとRubyの共通点と相違点」で触れた「Rubyではメソッド引数の()が省略できる」という点を思い出せば、Railsの例にある「text_field_tag 'login_name'」は、「text_field_tag('login_name')」すなわち「文字列'login_name'を引数とするtext_field_tagメソッドの呼び出し」であることがお分かりいただけるでしょう。
Rubyの「シンボル」
Railsのソースコードには、たびたび「:」で始まる表記が登場します。Rubyでは「:」で始まる表記を「シンボル」と呼び、プログラム中のさまざまな「名称」を表現することができます。
基本的に文字列オブジェクトは同一内容であってもそれぞれにインスタンスを生成しますが、シンボルでは同一内容の表現に対しては1つのオブジェクト(値)が対応します。シンボルと文字列は同じものではありませんが、Railsでは名称を指定する際、シンボルと文字列のどちらでも使えるようにしてあるメソッドが多くあります。
Rubyの「ハッシュ」
同じく、Railsのソースコードには、たびたび「=>」という記号が登場します。これはハッシュ(Javaでいうところのjava.util.HashMap)の表現に使われる記号で、{ キー1 => 値1 , キー2 => 値2 , ・・・ }のように用いられます。
ハッシュを引数に渡すときに、あいまいにならない場合(唯一の引数や、最後の引数がハッシュの場合など)には{ }を省略できるようになっています。
Copyright © ITmedia, Inc. All Rights Reserved.