我的模型
我正在尝试为Annotation创建一个表单。这个注解属于一个Map,每个注解应该有一个Boundary。一张地图可以有很多注解。
我首先通过让Annotation和Map 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"
}
我需要做什么才能立即为此注释创建边界对象?