はみ出しチュートリアル | 先頭: チュートリアル
各personの電話番号の編集は、多対一の関係のため少しトリッキーです。電話番号を編集できるようにedit.rhtml
を変更しましょう。
以下のコードをedit.rhtmlファイルに追加してください:
<p>Phones</p> <p><% @person.phones.each { |phone| %> <%= tag("input", "type" => "text", "id" => "phones[#{phone.id}][phone]", "name" => "phones[#{phone.id}][phone]", "value" => phone.phone) %> <%= phone.errors.on "phone" %><br/> <% } %></p> <p>Add new phone: (More phones can be added later)<br /> <input type="text" id="phones[new][phone]" name="phones[new][phone]" value=""> </p>
ああ、ちょと見苦しくなりました。今のところ、text_fieldヘルパーオブジェクトはより複雑な名前の属性を許可してきません。そのためタグヘルパーを使ってくるむ必要があります。複数の電話アイテムを扱うので、 それぞれを電話idでインデックス化されたハッシュに格納します。このことは、データが次のようにしてコントローラに返されることを意味します:
@params["phones"][1]["phone"] # >> 555-1234 @params["phones"][2]["phone"] # >> 555-6533
これを解析するための更新されたコントローラのコードを以下に示します:
def update @person = Person.find(@params["person"]["id"]) @person.attributes = @params["person"] saved = @person.save new_empty = false @params["phones"].each { |key, value| if key == "new" phone = @person.build_to_phones(value) new_empty = true if value["phone"].empty? else phone = Phone.find(key) phone.attributes = value end unless phone.phone.empty? saved = false unless phone.save end } if saved and new_empty redirect_to :action => "show", :id => @person.id else @target = "update" render "friends/edit" end end
それぞれのキーと値のペアすべてをループさせる方法と既存の電話番号を更新する方法、可能なら電話番号を追加する方法について注意してください。このフォームは1回につきひとつの電話番号を追加できます。新しい電話番号を追加する間は、編集ページにリダイレクトされます。
注意: ActiveRecordは自動的かつ魔法的にbuild_to_phonesメソッドを生成します。
おめでとうございます。あなたはチュートリアルを修了しました! これまでのところで取り上げたものを復習するために、チュートリアル戻ることができます。
はみ出しチュートリアル | 先頭: チュートリアル
カテゴリ:チュートリアル