Rails2.3のNested Attributesを試してみた.

Nested Attributesを使うと更新がネストしたモデルでもできるとか。

詳しくはhttp://webtama.jp/series/railstips/articles/31を見てください.

では早速、表示させてみる

has_many throughでもできるかが気になったので試してみた

Event <---> EventsUser <---> User

こんな感じで多対多を実現

accepts_nested_attributes_forがミソでこれを指定するとネスト更新が扱えるようになる.

class Event < ActiveRecord::Base
  has_many :users, :through=>:events_users
  accepts_nested_attributes_for :users
end

コントローラにインスタンス変数を作って値をネストさせる

  def index
    @event = Event.new  
    @event.title="EventTitle"
    
    user = User.new
    user.name="Satoruk"
    @event.users << user
    
    respond_to do |format|
      format.html
      format.xml  { render :xml => @event }
    end
  end

ERBで表示

<% form_for(@event) do |f| %>
<%= f.error_messages %>

<% f.fields_for :users  do |user_f| %>
<p>
nsm<%#= user_f.label :name %><br />
<%= user_f.text_field :name %>
</p>
<% end %>

<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.submit 'Create' %>
</p>
<% end %>


っで実行すると

<form action="/events" class="new_event" id="new_event" method="post"><div style="margin:0;padding:0"><input name="authenticity_token" type="hidden" value="3YNVq51AjbdqB6EVzadnMPiyW5k0irUzPqVebJ3V0Kw=" /></div>

<p>
nsm<br />
<input id="event_users_attributes_0_name" name="event[users_attributes][0][name]" size="30" type="text" value="Satoruk" />
</p>

<p>
<label for="event_title">Title</label><br />
<input id="event_title" name="event[title]" size="30" type="text" value="EventTitle" />
</p>
<p>
<input id="event_submit" name="commit" type="submit" value="Create" />
</p>
</form>

表示できたー、次は登録でも試すか