2010年8月30日月曜日

1対nのリレーションでformの使い方(fields_for, accepts_nested_attributes_for)



※RAILS_GEM_VERSION = '2.3.8'


昨日これが解らず、半日潰してしまった。。。


一応、忘れないようにメモしておく。





やりたいことは、1対nのリレーション、ここではacceptテーブルにacceptdetailが紐づいていますが、これを更新画面でformを使ってシンプルに書きたかった。





viewはこんな感じ




<h1>Editing accept</h1>

<% form_for @accept, :url => { :action => :update } do |form| %>
<%= error_messages_for :accept %>
<p>
aaa:<%= form.text_field :name %>
</p>

<p>
<fieldset>
<legend>詳細</legend>

<% form.fields_for :acceptdetails do |detail| %>
test:
<%= detail.text_field :name %>
<% end %>
</fieldset>

</p>

<p>
<%= submit_tag %>
</p>
<% end %>

<%= link_to 'Show', @accept %> |
<%= link_to 'Back', accepts_path %>



controllerはこれ



class AcceptsController < ApplicationController


# GET /accepts/1/edit


def edit


@accept = Accept.find(params[:id])


end



そして、肝のmodels



class Accept < ActiveRecord::Base


belongs_to :patient


has_many :acceptdetails


accepts_nested_attributes_for :acceptdetails


end






参考にしていた本に、accepts_nested_attributes_for命令が載っていなかったのでハマりました。。。


このようにaccepts_nested_attributes_for命令で子のネストがありますよって宣言しておけば、viewのところでfields_for命令を使って簡潔に子のネストを記述できます。





version=2.3以降からこうなったのかな?


例えば今、version=2.3でアプリを作って、5年後にメンテナンスが発生した場合、version=2.3の情報ってその時ちゃんと取れるんだろうか?


出来なかったら、最新versionにするためのメンテナンスが発生するのか?><;





0 件のコメント:

コメントを投稿