- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

Ruby/Ruby on Rails/フォームの入れ子

はじめに Edit

Railscasts - Nested Model Form Part 1” で解説されているRails2.3以降でネストしたフォームの実現方法についてのメモ書きです。

Railsでのネストしたフォームのその他の情報は、一つ上の階層のページも参考にして下さい。

試した環境 Edit

$ ruby script/about 
About your application's environment
Ruby version              1.8.7 (i486-linux)
RubyGems version          1.3.6
Rack version              1.0
Rails version             2.3.5
Active Record version     2.3.5
Active Resource version   2.3.5
Action Mailer version     2.3.5
Active Support version    2.3.5
Application root          (home directory略)/test/rails/nested_model_form/railscasts_196_nested_model_form
Environment               development
Database adapter          sqlite3

Rails以外にその他必要なgem:

  • nifty-generators (0.4.0)

試す前に以下のようにあらかじめ入れておきましょう。

sudo gem install nifty-generators

試す際の注意点 Edit

この辺のことは、Railscastsのエントリーのコメント欄にもありますが…

WARNINGS Can't mass-assign these protectedエラーが出て更新できない Edit

nifty-generators の今のバージョンでは script/generate nifty_scaffold 時に、Surveyモデル(survey.rb)に

1
2
class Survey < ActiveRecord::Base
  attr_accessible :name

が生成されていますが、これがあるとname以外に値が入れられなくなるため(attr_accessibleで指定したものしか代入できない、指定していないのがattr_protected になる模様)、

WARNINGS Can't mass-assign these protected〜〜

などとログに出て、子モデルのQuestionが更新されません。

なので、今回の例では以下のようにコメントアウトしておきます。

1
2
class Survey < ActiveRecord::Base
#  attr_accessible :name

これでWARNINGSでなくて、更新もできるはず。

render :partial=> って要らないの? Edit

動画ではpartial renderを最初スニペットで挿入して、以下のように書き換えていますが、

<%= render 'question_fields', :f => builder %>

scaffoldのコードように renderで:partial で指定しなくていいの?って思うかもしれませんが、
viewのrenderでは:partial指定せず、最初の引数に文字列を指定した場合はpartialになります。

上記は以下のようなpartial指定した書き方と同様な動作になるようです。

<%= render :partial => 'question_fields', :locals => {:f => builder} %>

Railscastsや動画の例のようにpartialなフォームを書く場合は、:partialを略した方が簡単に書けますね。

詳しくは action_viewのソース読め ばいいかと

reject_ifを指定しても、編集時に空にしたQuestionが消えない件 Edit

んー、そもそもRailscastsの動画(6:00前後)これなんで編集時に空にしたQuestionが消えているんでしょう???(挙動がわかる方教えてください…)

accepts_nested_attributes_forの:reject_ifのドキュメントやソースを見るに
新規に追加したレコードのみ:reject_ifで判定されているようで、
最初の編集時に空でもなんでも要素を挿入してすでに生成されている場合(サーバーのログ見ると入力に:idが割り振られている)は、reject_ifで判定されません。

あくまで、:reject_ifはレコードを新規に追加するときの判定用のようです。


No comment. Comments/Ruby/Ruby on Rails/フォームの入れ子/RailsCasts 196のNested Model Form Part 1について?

Name:

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2010-06-01 Tue 20:18:38 JST (3480d)