Viewヘルパーを使ったCRUD作成 (2/4)
作成:2012-02-27 07:58
更新: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文だけです。
そして、フォーム送信された処理を行うupdateアクションでは、送信されたフォームの情報から指定IDのModelインスタンスを取得し、内容を更新するのに以下のような処理を行なっています。
※ちなみに、このeditアクションへのアクセスは、以下のような形で行なってください。
一応、下のリスト欄に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])findでは、params[:id]というようにして送られたパラメータからIDの値を取り出しています。そしてupdate_attributesでは、引数にparams[:helo]を指定しています。これで、そのまま送信されたフォームの内容がupdate_attributesで更新されテーブルに反映されるのです。なんか騙されてるんじゃ?と思うくらいに簡単ですね。
obj.update_attributes(params[:helo])
※ちなみに、このeditアクションへのアクセスは、以下のような形で行なってください。
http:/ドメイン/helos/番号/edithelosの後に更新するレコードのID番号が、その後にeditが付きます。この後、routes.rbを修正する関係で、こう変わります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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
※関連コンテンツ