Ruby on Rails
RelationalFormsのチュートリアル

はみ出しチュートリアル | 先頭: チュートリアル
各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メソッドを生成します。

おめでとうございます。あなたはチュートリアルを修了しました! これまでのところで取り上げたものを復習するために、チュートリアル戻ることができます。

はみ出しチュートリアル | 先頭: チュートリアル
カテゴリ:チュートリアル