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

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

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

■データの編集用フォームはどうなる?

新規作成のフォームはできました。では、既にあるデータを編集するためのフォームはどうなるのでしょうか。実は、これは「全く同じ」なのです。先ほどのnew.html.erbのソースコードを、そのままedit.html.erbにコピー&ペーストすれば出来上がりです。

一応、下のリスト欄にViewテンプレートとアクションメソッドのリストを掲載しておきます。テンプレートに関してはnewそのまんまです。違いは何かといえば、edit/updateのメソッドです。

これらは、新たにデータを追加するのではなく、既にテーブルに保存されているレコードのデータを取り出して表示し、送られたデータでそのレコードを更新する、という形になります。ですから作業としては、

1. findで、特定のIDのレコードを取得し、それをフォームに設定して表示させる。
2. updateでは、送られたフォームの内容で、指定されたIDのレコードを更新する。

といった形で行われなければいけません。単に新しいものを追加すればいいnewとは違うのです。――まず、findで「指定されたIDのレコードを検索し、フォームに表示させる」という部分を見てみましょう。これを行なっているのは、実は下の1文だけです。
@helo = Helo.find(params['id'])
Viewテンプレート側では、フォームの作成を<%= form_for(@helo) do |f| %>というようにして行なっています。@heloインスタンス変数の内容を引数に渡してform_forを呼び出しているわけですね。この@heloに、あらかじめ検索しておいたModelインスタンスを渡しておけば、それに応じて自動的にフォームが生成されます。もちろん、フォームの各コントロールには、Modelインスタンスに保管されている各データが自動的に設定され表示されます。

そして、フォーム送信された処理を行うupdateアクションでは、送信されたフォームの情報から指定IDのModelインスタンスを取得し、内容を更新するのに以下のような処理を行なっています。
    obj = Helo.find(params[:id])
    obj.update_attributes(params[:helo])
findでは、params[:id]というようにして送られたパラメータからIDの値を取り出しています。そしてupdate_attributesでは、引数にparams[:helo]を指定しています。これで、そのまま送信されたフォームの内容がupdate_attributesで更新されテーブルに反映されるのです。なんか騙されてるんじゃ?と思うくらいに簡単ですね。

※ちなみに、このeditアクションへのアクセスは、以下のような形で行なってください。
http:/ドメイン/helos/番号/edit
helosの後に更新するレコードのID番号が、その後にeditが付きます。この後、routes.rbを修正する関係で、こう変わります。

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

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

●プログラム・リスト●

※edit.html.erb

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

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

  <% if @helo.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@helo.errors.count, "error") %> prohibited this helos from being saved:</h2>
      <ul>
      <% @helo.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <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 %>


※edit/updateアクション

  def edit
    @title = "サンプルレイアウト"
    @header_content = "データの更新"
    @msg = "データの更新を行います。"
    @helo = Helo.find(params['id'])
  end
  
  def update
    obj = Helo.find(params[:id])
    obj.update_attributes(params[:helo])
    redirect_to obj
  end
※関連コンテンツ

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