【问题标题】:Rails: Creating a Multiple Model Form over n association levelsRails:在 n 个关联级别上创建多个模型表单
【发布时间】:2010-10-16 20:32:02
【问题描述】:

谁能告诉我为什么这个问题末尾的表格不能正常工作?

  • 保存不起作用
  • select-helper 不选择 根据对象@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 %>

【问题讨论】:

    标签: ruby-on-rails forms webforms


    【解决方案1】:

    好吧,如果我错了,请纠正我,但看起来您实际上并未将对象保存在任何地方。在您的创建和更新操作中,您调用new,然后不保存它。

    要纠正这个问题,你可以这样做:

    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
    

    然后在您的选择框中,您将尝试查找Entity 的每条记录,而不是与@kid 相关的Entity 的那些字段。为此,您必须在孩子和祖父母之间建立关系。

    # 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) %>
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多