はみ出しチュートリアル | 先頭: チュートリアル
各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メソッドを生成します。
おめでとうございます。あなたはチュートリアルを修了しました! これまでのところで取り上げたものを復習するために、チュートリアル戻ることができます。
はみ出しチュートリアル | 先頭: チュートリアル
カテゴリ:チュートリアル