accepts_nested_attributes_forが動かない
多対多のテーブルの延長で、関連テーブルを更新するのに、accepts_nested_attributes_forを使えば良さそうという事で、
group -> usergroup <- user
という関係を構築する。
モデルは、こんな感じ
class Group < ActiveRecord::Base # has_many for users has_many :groupuser has_many :user, :through=>:groupuser # nested attributes for users accepts_nested_attributes_for :groupuser end --------------------------------------------- class User < ActiveRecord::Base # has_many for groups has_many :groupuser has_many :group, :through=>:groupuser # nested attributes for groups accepts_nested_attributes_for :groupuser end --------------------------------------------- class Groupuser < ActiveRecord::Base belongs_to :user belongs_to :group end
groupsの編集画面でusersをコンボで選択できるようなviewを作成
<h1>Editing group</h1> <% form_for(@group) do |f| %> <%= f.error_messages %> <p> <%= f.label :name %><br /> <%= f.text_field :name %> </p> <%# nested model forms %> <% f.fields_for :groupusers do |userx| %> <p> <%= userx.label :user, 'user:' %><br /> <%= userx.select(:user_id, User.find(:all).map{|u| [u.name, u.id]}) %> </p> <% end %> <p> <%= f.submit 'Update' %> </p> <% end %> <%= link_to 'Show', @group %> | <%= link_to 'Back', groups_path %>
これで、表示は出来た。
しかし、ここで更新を行うと、groups_controller.rbのupdateでエラーが発生する。
def update @group = Group.find(params[:id]) respond_to do |format| if @group.update_attributes(params[:group]) <--- ここでエラー flash[:notice] = 'Group was successfully updated.' format.html { redirect_to(@group) } format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @group.errors, :status => :unprocessable_entity } end end end
うーーん、なぜだ?
editから送られてくるリクエストは、
{"group"=>{"name"=>"G001", "groupusers"=>{"user_id"=>"1"}}, "commit"=>"Update", "_method"=>"put", "authenticity_token"=>"rJ7LMRx3gDIeXOzArgZYoUE/F7/v3r+YDETbteGFgiU=", "id"=>"1"}
となっていて、groupusers_attributesにはなっていないが、edit.html.erbを修正して、
{"group"=>{"name"=>"G001", "groupusers_attributes"=>{"user_id"=>"1"}}, <------ ここ "commit"=>"Update", "_method"=>"put", "authenticity_token"=>"rJ7LMRx3gDIeXOzArgZYoUE/F7/v3r+YDETbteGFgiU=", "id"=>"1"}