2009-04-01 5 views
4

この質問の最後にあるフォームがなぜうまくいかないのか誰にでも教えてください。Rails:n個の関連レベルで複数のモデルフォームを作成

  • 保存
  • 選択ヘルパーオブジェクト@kid

に応じて全部がRailsの2.2.2に基づいていない、アップグレードされた 値を選択していない動作しません。この問題を解決するためのRails 2.3への移行はオプションではありません。 :-)

私はthis recipeを使用して複数のモデルフォームを作成しました。

# CLASS GRANDPARENT 
class Grandparent < ActiveRecord::Base 
    has_many :parents 
end 

# CLASS PARENT 
class Parent < ActiveRecord::Base 
    belongs_to :grandparent, :class_name => "Grandparent", :foreign_key => "grandparent_id" 
    has_many :kids 
end 

# CLASS KID 
class Kid < ActiveRecord::Base 
    belongs_to :parent, :class_name => "Parent", :foreign_key => "parent_id" 

    # Virtual attribute setter for new self.parent.grandparent (Grandparent) attributes 
    def new_grandparent_attributes=(_gp_attributes) 
    self.parent.build_grandparent(_gp_attributes) 
    end 

    # Virtual attribute setter for existing self.parent.grandparent (Grandparent) attributes 
    def existing_grandparent_attributes=(_gp_attributes) 
    unless self.parent.grandparent.new_record? 
     attributes = _gp_attributes[self.parent.grandparent.id.to_s] 
     if attributes 
     self.parent.grandparent.attributes = attributes 
     else 
     self.parent.grandparent.delete(grandparent) 
     end 
    end 
    end 

end 

# CONTROLLER KIDS 
class KidsController < ApplicationController 
    def new 
    @kid = Kid.new 
    end 

    def edit 
    @kid = Kid.find(params[:id]) 
    end 

    def create 
    params[:kid][:new_grandparent_attributes] ||= {} 
    @kid = Kid.new(params[:kid]) 
    end 

    def update 
    params[:kid][:existing_grandparent_attributes] ||= {} 
    @kid = Kid.find(params[:id]) 
    end 

end 


# THIS IS THE MULTI-MODEL FORM USED IN THE VIEW 

<% form_for(@kid) do |f| %> 
    <p> 
     <% new_or_existing = @kid.parent.grandparent.new_record? ? 'new' : 'existing' %> 
     <% prefix = "kid[#{new_or_existing}_grandparent_attributes][]" %> 

     <% fields_for prefix, @kid.parent.grandparent do |g_f| -%> 
      <p> 
       <%= g_f.label :, 'Grandparent Name' %><br /> 
       <!-- THE FOLLOWING FORM DOESN'T CHANGE ACCORDING TO EXISTING @child --> 
       <%= @grandparents = Entity.find(:all, :order => :name) 
       g_f.collection_select(:name ,@grandparents, :id, :name) 
       %> 
      </p> 
     <% end %> 
    </p> 
    <p> 
     <%= f.label :name, "Kid Name" %><br /> 
     <%= f.text_field :name %> 
    </p> 
    <%= submit_tag 'Go' %> 
<% end %> 

答えて

1

私が間違っている場合は私を修正しますが、実際にはどこにでもオブジェクトを保存しているようには見えません。作成アクションと更新アクションでは、newを呼び出していて、それを保存していません。あなたがEntityのすべてのレコード、@kidに関連するEntityのないそれらのフィールドを見つけようとしているあなたの選択ボックスに次に

def create 
    params[:kid][:new_grandparent_attributes] ||= {} 
    @kid = Kid.new(params[:kid]) 
    if @kid.save 
    # successful save logic here 
    else 
    #failed save logic here 
    end 
end 

def update 
    params[:kid][:existing_grandparent_attributes] ||= {} 
    @kid = Kid.find(params[:id]) 
    if @kid.update_attributes(params[:kid]) 
    #successful save logic here 
    else 
    #failed save logic here 
    end 
end 

:あなたが行うことができ、これを是正するため

。これを行うには、子供と祖父母の間の関係を確立する必要があります。

# CLASS GRANDPARENT 
class Grandparent < ActiveRecord::Base 
    has_many :parents 
    has_many :grand_kids, :through => :parents 
end 

# CLASS PARENT 
class Parent < ActiveRecord::Base 
    belongs_to :grandparent, :class_name => "Grandparent", :foreign_key => "grandparent_id" 
    has_many :kids 
end 

# CLASS KID 
class Kid < ActiveRecord::Base 
    belongs_to :parent, :class_name => "Parent", :foreign_key => "parent_id" 
    belongs_to :grandparent 

    # ... 

この方法で、子供の祖父母に@kid.grandparentsでアクセスできます。次に、選択フィールドを生成することができます:

<%= g_f.collection_select(:name ,@kid.grandparents, :id, :name) %> 
関連する問題