多态模型,Forms和AssociationTypeMismatch

时间:2012-10-15 00:06:19

标签: ruby-on-rails ruby forms polymorphism

我有两个模型,内容和页面

class Content < ActiveRecord::Base
   attr_accessible :large_description, :short_description
   belongs_to :contentable , :polymorphic => true
end

class Page < ActiveRecord::Base
   extend FriendlyId
   friendly_id :title, use: [:slugged, :history]
   attr_accessible :active, :menu, :slug, :title, :contents

   validates :title, presence: true

   has_many :contents, as: :contentable
end

这是我创建包含内容的新页面的简单表格

<%= form_for([:admin,@page], :html => {:class => "nice custom"}) do |f| %>
  <div class="formRow">
    <%= f.label :title, "Title"%>
    <%= f.text_field :title, :class => 'input-text'%>
  </div>
<%= f.fields_for :contents do |content_form| %>
  <div class="formRow">
   <%= content_form.label :short_description, "Short Description"%>
   <%= content_form.text_area :short_description, :class => 'tinymce expand'%>
  </div>
  <div class="formRow">
    <%= content_form.label :large_description, "Large Description"%>
    <%= content_form.text_area :large_description, :class => 'tinymce expand'%>
  </div>
<% end %>
 <div class="formRow">
    <%= f.submit "Create", :class => 'button small nice blue'%>
 </div>
<% end %>

最后这是我的页面控制器

class Admin::PagesController < ApplicationController
  layout 'admin'
  def index
    @pages = Page.order("created_at")
  end
  def new
    @page = Page.new
  end
  def create
    @page = Page.new(params[:page])
    if @page.save
     redirect_to page_url
    else
     render :new
     end
  end

  def show
    @page = Page.find(params[:id])
  end

  def destroy
    @page = Page.find(params[:id])
    @page.destroy
    redirect_to page_url
  end
end

我使用了命名空间Admin。 所以问题是当我发送表格时,我收到这个错误而且我不知道为什么不匹配:

  

Admin :: PagesController #create中的ActiveRecord :: AssociationTypeMismatch   内容(#70150608194420)预期,得到阵列(#70150590276780)

     

activerecord(3.2.8)   LIB / active_record /协会/ association.rb:204:在   raise_on_type_mismatch' activerecord (3.2.8) lib/active_record/associations/collection_association.rb:308:in块   替换&#39; activerecord(3.2.8)   lib / active_record / associations / collection_association.rb:308:在each' activerecord (3.2.8) lib/active_record/associations/collection_association.rb:308:in 替换&#39; activerecord(3.2.8)   LIB / active_record /协会/ collection_association.rb:41:在   writer' activerecord (3.2.8) lib/active_record/associations/builder/association.rb:51:in阻止   define_writers&#39; activerecord(3.2.8)   lib / active_record / attribute_assignment.rb:94:block in assign_attributes' activerecord (3.2.8) lib/active_record/attribute_assignment.rb:93:in每个&#39; ActiveRecord的   (3.2.8)lib / active_record / attribute_assignment.rb:93:in   assign_attributes' activerecord (3.2.8) lib/active_record/base.rb:498:in初始化&#39;   app / controllers / admin / pages_controller.rb:13:在new' app/controllers/admin/pages_controller.rb:13:in创建&#39; ActionPack的   (3.2.8)lib / action_controller / metal / implicit_render.rb:4:in   send_action' actionpack (3.2.8) lib/abstract_controller/base.rb:167:in process_action&#39; ActionPack的   (3.2.8)lib / action_controller / metal / rendering.rb:10:in   进程中的process_action' actionpack (3.2.8) lib/abstract_controller/callbacks.rb:18:in阻止&#39;   activesupport(3.2.8)lib / active_support / callbacks.rb:414:in   _run__3558390125630086563__process_action__2004224720818030891__callbacks' activesupport (3.2.8) lib/active_support/callbacks.rb:405:in __ run_callback&#39; activesupport(3.2.8)   lib / active_support / callbacks.rb:385:在_run_process_action_callbacks' activesupport (3.2.8) lib/active_support/callbacks.rb:81:in run_callbacks&#39; actionpack(3.2.8)   lib / abstract_controller / callbacks.rb:17:在process_action' actionpack (3.2.8) lib/action_controller/metal/rescue.rb:29:in process_action&#39;   actionpack(3.2.8)   lib / action_controller / metal / instrumentation.rb:30:在block in process_action' activesupport (3.2.8) lib/active_support/notifications.rb:123:in块中的仪器&#39;   activesupport(3.2.8)   lib / active_support / notifications / instrumenter.rb:20:在instrument' activesupport (3.2.8) lib/active_support/notifications.rb:123:in 工具&#39; actionpack(3.2.8)   lib / action_controller / metal / instrumentation.rb:29:在process_action' actionpack (3.2.8) lib/action_controller/metal/params_wrapper.rb:207:in process_action&#39;   activerecord(3.2.8)   LIB / active_record / railties / controller_runtime.rb:18:在   process_action' actionpack (3.2.8) lib/abstract_controller/base.rb:121:in过程&#39; actionpack(3.2.8)   lib / abstract_controller / rendering.rb:45:在process' actionpack (3.2.8) lib/action_controller/metal.rb:203:in发送&#39; ActionPack的   (3.2.8)lib / action_controller / metal / rack_delegation.rb:14:in   dispatch' actionpack (3.2.8) lib/action_controller/metal.rb:246:in 阻止行动&#39; actionpack(3.2.8)   lib / action_dispatch / routing / route_set.rb:73:在call' actionpack (3.2.8) lib/action_dispatch/routing/route_set.rb:73:in发送&#39;   actionpack(3.2.8)lib / action_dispatch / routing / route_set.rb:36:in   call' journey (1.0.4) lib/journey/router.rb:68:in阻止通话&#39;   旅程(1.0.4)lib / journey / router.rb:56:在each' journey (1.0.4) lib/journey/router.rb:56:in电话&#39; actionpack(3.2.8)   lib / action_dispatch / routing / route_set.rb:600:call' actionpack (3.2.8) lib/action_dispatch/middleware/best_standards_support.rb:17:in 来电&#39; rack(1.4.1)lib / rack / etag.rb:23:in call' rack (1.4.1) lib/rack/conditionalget.rb:35:in call&#39; actionpack(3.2.8)   lib / action_dispatch / middleware / head.rb:14:in call' actionpack (3.2.8) lib/action_dispatch/middleware/params_parser.rb:21:in来电&#39;   actionpack(3.2.8)lib / action_dispatch / middleware / flash.rb:242:in   call' rack (1.4.1) lib/rack/session/abstract/id.rb:205:in上下文&#39;   rack(1.4.1)lib / rack / session / abstract / id.rb:200:call' actionpack (3.2.8) lib/action_dispatch/middleware/cookies.rb:339:in来电&#39;   activerecord(3.2.8)lib / active_record / query_cache.rb:64:in call' activerecord (3.2.8) lib/active_record/connection_adapters/abstract/connection_pool.rb:473:in call&#39; actionpack(3.2.8)   lib / action_dispatch / middleware / callbacks.rb:28:in block in call' activesupport (3.2.8) lib/active_support/callbacks.rb:405:in 运行 _3479256987463636693_ 致电 _4454778504255292268__callbacks&#39;   activesupport(3.2.8)lib / active_support / callbacks.rb:405:in   __run_callback' activesupport (3.2.8) lib/active_support/callbacks.rb:385:in _ run_call_callbacks&#39;   activesupport(3.2.8)lib / active_support / callbacks.rb:81:in   run_callbacks' actionpack (3.2.8) lib/action_dispatch/middleware/callbacks.rb:27:in呼叫&#39; ActionPack的   (3.2.8)lib / action_dispatch / middleware / reloader.rb:65:in call' actionpack (3.2.8) lib/action_dispatch/middleware/remote_ip.rb:31:in call&#39; actionpack(3.2.8)   lib / action_dispatch / middleware / debug_exceptions.rb:16:in call' actionpack (3.2.8) lib/action_dispatch/middleware/show_exceptions.rb:56:in call&#39;   railties(3.2.8)lib / rails / rack / logger.rb:26:in call_app' railties (3.2.8) lib/rails/rack/logger.rb:16:in来电&#39; actionpack(3.2.8)   lib / action_dispatch / middleware / request_id.rb:22:in call' rack (1.4.1) lib/rack/methodoverride.rb:21:in来电&#39;机架(1.4.1)   lib / rack / runtime.rb:17:in call' activesupport (3.2.8) lib/active_support/cache/strategy/local_cache.rb:72:in call&#39;架   (1.4.1)lib / rack / lock.rb:15:in call' actionpack (3.2.8) lib/action_dispatch/middleware/static.rb:62:in call&#39;铁路(3.2.8)   lib / rails / engine.rb:479:在call' railties (3.2.8) lib/rails/application.rb:223:in来电&#39;机架(1.4.1)   lib / rack / content_length.rb:14:in call' railties (3.2.8) lib/rails/rack/log_tailer.rb:17:in来电&#39;机架(1.4.1)   lib / rack / handler / webrick.rb:59:in service' /Users/ogonbat/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpserver.rb:138:in service&#39;   /Users/ogonbat/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpserver.rb:94:in   {_ 1}}阻止了start_thread&#39;

这是请求参数

  

{&#34; UTF8&#34; = GT;&#34;✓&#34 ;,   &#34; authenticity_token&#34; = GT;&#34; g44p + IPxvdm2ouGAE2u2dV / cCKK8uF6G3XLL4z26zrI =&#34 ;,   &#34;页面&#34; = GT; {&#34;标题&#34; = GT;&#34; zfdzfdsf&#34 ;,   &#34;内容&#34; = GT; {&#34; SHORT_DESCRIPTION&#34; = GT;&#34;

sdfdsf

&#34 ;,   &#34; large_description&#34; =&gt;&#34;

dsfdsf

&#34;}},&#34;提交&#34; =&gt;&#34;创建&#34;}

提前感谢您的帮助

2 个答案:

答案 0 :(得分:2)

如果页面为has_many :contents,那么奇怪params[:page][:contents]是哈希而不是数组......

修复不一致的一端或另一端。如果你有一个has_many真实关系,并且你想为它创建一个表单,在主对象中为它预填充一些空项,并迭代它们,生成相应的字段。

您可以查看对{​​{3}}的所有回复,以了解您的需求。

答案 1 :(得分:2)

尝试将accepts_nested_attributes_for :contents添加到您的Page模型中,我相信这应该是诀窍(基本上,它应该从params [:page] [:contents]构建关联的contents记录数组)

修改

您还应该将contents_attributes attr_accessible作为{{1}}属性添加到其中