0

我的模型

我正在尝试为Annotation创建一个表单。这个注解属于一个Map,每个注解应该有一个Boundary。一张地图可以有很多注解。

我首先通过让AnnotationMap has_one Boundary来创建关联,但后来我切换到使用 polymorphic boundary_object。无论如何,错误都是一样的。

has_one :boundary, :as => :boundary_object         # <= Map
has_one :boundary, :as => :boundary_object         # <= Annotation
belongs_to :boundary_object, :polymorphic => true  # <= Boundary

视图和控制器

事情是这样的:首先我Boundary.new在这里创建了一个新的边界对象,因为我没有预先设置的注释对象,因为表单可以多次提交。

maps/show.html.erb

<%= form_for([@map, Annotation.new], :remote => true ) do |f| %>
    <%= f.text_area :body, :cols => 80, :rows => 10, :style => "width: 500px" %>
    <%= f.fields_for Boundary.new do |b| %>
      <%= b.text_field :ne_x, :style => "display:none" %>
      <%= b.text_field :ne_y, :style => "display:none" %>
      <%= b.text_field :sw_x, :style => "display:none" %>
      <%= b.text_field :sw_y, :style => "display:none" %>
    <% end %>
<% end %>

我也可以使用f.fields_for :boundary,如果我有这个maps_controller.rb

@annotation = @map.annotations.build
@annotation.boundary = Boundary.new

但结果还是一样。

annotations_controller.rb

def create
  @annotation = Annotation.new(params[:annotation])
  respond_to do |format|
    if @annotation.save
      format.js { }
  end
end

错误

提交该表单时,这会导致该create方法的第一行出现以下错误。

ActiveRecord::AssociationTypeMismatch (Boundary(#2158793660) 预期,得到 ActiveSupport::HashWithIndifferentAccess(#2165684420))

显然,表格在没有整个边界的情况下起作用。这些是提交的参数:

{
  "utf8"=>"✓",
  "authenticity_token"=>"6GDF6aDc6GMR3CMP+QzWKZW9IV9gSxfdkxipfg39q7U=",
  "annotation"=>
  {
    "body"=>"foo bar",
    "boundary"=>
    {
      "ne_x"=>"11312", 
      "ne_y"=>"5919", 
      "sw_x"=>"6176", 
      "sw_y"=>"1871"
    }
  }, 
 "map_id"=>"1"
}

我需要做什么才能立即为此注释创建边界对象?

4

1 回答 1

1

根据您的协会:

首先,您需要构建一个新的边界对象(有关更多信息,请参见此处):

def show
  @map = ...
  @annotation = @map.annotations.build
  @boundary = @annotation.build_boundary # build new boundary
end

其次,您需要编辑您的视图:

<%= form_for([@map, @annotation], :remote => true ) do |f| %>
  <%= f.text_area :body, :cols => 80, :rows => 10, :style => "width: 500px" %>
  <%= f.fields_for :boundary do |b| %>
    ...
  <% end %>
<% end %>

第三,检查您在 Annotation 模型中是否为您的 Boundary 设置了 accept_nested_attributes_for

accepts_nested_attributes_for :boundary

然后表格将如下所示 - 请注意关联的名称需要_attributes

<input … name="annotation[boundary_attributes][ne_x]" … />
于 2012-05-21T11:18:48.687 回答