0

私のモデル

Annotationのフォームを作成しようとしています。このアノテーションはMapに属し、各アノテーションには 1 つの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"
}

この注釈のBoundaryオブジェクトをすぐに作成できるようにするには、どうすればよいですか?

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

3 番目に、注釈モデルの境界にaccept_nested_attributes_forがあることを確認します。

accepts_nested_attributes_for :boundary

フォームは次のようになります。関連付けの名前には次のものが必要であることに注意してください_attributes

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