libro
www.tuyano.com
初心者のためのRuby on Rails3入門

Viewヘルパーを使ったCRUD作成 (1/4)

作成:2012-02-27 07:55
更新:2012-02-27 07:55

■Viewヘルパーを使ったフォームの作成

前回、CRUDの基本的な機能をひと通り作成しましたが、どうも面倒臭いな……と思う部分が何箇所かあったことでしょう。routes.rbの記述もそうですが、一番大きいのは「フォーム」の記述です。

例えば、新しいデータを追加するnewアクションのページを考えてみましょう。ここではデータを送信するフォームを用意しますが、どうもこれがスマートではありません。いちいちフォームのタグを全部手書きして送信し、受け取ったアクション側で1つ1つの値を取り出してModelインスタンスを作る……。なんか、とてもベタで、あまり便利そうにも見えませんね。

実をいえば、Railsにはもっと便利にフォームを作成するための機能がちゃんと備わっているのです。それは「View(ビュー)ヘルパー」と呼ばれるものです。Viewヘルパーというのは、文字通りViewの作成をHelpするためのものです。この機能を利用することで、Viewをよりすっきりと作成することができます。

では、さっそく前回作成したHelo追加のためのアクション(new/create)を修正してみることにしましょう。下のリスト欄に、修正したnew.html.erbを掲載しておきました。また、HelosControllerのnew/createアクションのメソッドもあわせて修正しておきましょう。

■ビューヘルパーの内容

ここでは、フォームの生成は以下のような形で行なっています。
<%= form_for(@helo) do |f| %>
   ……コントロール関係の記述……
<% end %>
この「form_for」というのが、Viewヘルパーの機能です。これは、引数に指定したオブジェクト(ここでは@helo)をもとにフォームの生成を行うことができます。ここはオブジェクトは変数fに代入されています。そしてこのfのプロパティをもとに、以下のようにしてコントロール関係のタグが生成されます。
<%= f.label :title %><br />
<%= f.text_field :title %>
これはtitleのタグを生成している部分ですね。このようにして、<label>タグと<input type="text">タグのコードが出力されます。labelメソッドとtext_fieldを呼び出すだけなのがわかります。――こうして入力する項目を用意したら、最後に送信ボタンをつけます。これでフォームは完成です。
<%= f.submit %>

■アクション側の処理

では、フォームから送信されたものはどのように処理されるのでしょうか。createアクションのメソッドを見ていると、以下のようにしてModelインスタンスを作成・保存していることがわかります。
   obj = Helo.new(params[:helo])
   obj.save
params[:helo]という形で、送信されたフォームの情報をまるごとnewの引数に指定するだけです。個別に保存するデータの項目と値を用意する必要はありません。Viewヘルパーを使ってフォームを作ると、このように非常に単純にModelを作れます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※new.html.erb

<p><%= @msg %></p>
<hr>

<%= form_for(@helo) do |f| %>

 <div class="field">
   <%= f.label :title %><br />
   <%= f.text_field :title %>
 </div>
 <div class="field">
   <%= f.label :content %><br />
   <%= f.text_field :content %>
 </div>
 <div class="actions">
   <%= f.submit %>
 </div>
<% end %>


※new/createアクションの修正

 def new
   @title = "サンプルレイアウト"
   @header_content = "データの追加"
   @msg = "データの追加を行います。"
   @helo = Helo.new
  end
  
 def create
   obj = Helo.new(params[:helo])
   obj.save
   redirect_to obj
 end
※関連コンテンツ

「初心者のためのRuby on Rails3入門」に戻る