ruby-on-rails - 多态模型、Forms 和 AssociationTypeMismatch

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

最后这是我的页面 Controller

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

我使用了命名空间管理员。 所以问题是当我发送表单时,我收到此错误,但我不明白为什么不匹配:

ActiveRecord::AssociationTypeMismatch in Admin::PagesController#create Content(#70150608194420) expected, got Array(#70150590276780)

activerecord (3.2.8) lib/active_record/associations/association.rb:204:in raise_on_type_mismatch' activerecord (3.2.8) lib/active_record/associations/collection_association.rb:308:inblock in replace' activerecord (3.2.8) lib/active_record/associations/collection_association.rb:308:in each' activerecord (3.2.8) lib/active_record/associations/collection_association.rb:308:in replace' activerecord (3.2.8) lib/active_record/associations/collection_association.rb:41:in writer' activerecord (3.2.8) lib/active_record/associations/builder/association.rb:51:inblock in define_writers' activerecord (3.2.8) lib/active_record/attribute_assignment.rb:94:in block in assign_attributes' activerecord (3.2.8) lib/active_record/attribute_assignment.rb:93:ineach' activerecord (3.2.8) lib/active_record/attribute_assignment.rb:93:in assign_attributes' activerecord (3.2.8) lib/active_record/base.rb:498:ininitialize' app/controllers/admin/pages_controller.rb:13:in new' app/controllers/admin/pages_controller.rb:13:increate' 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:inprocess_action' actionpack (3.2.8) lib/action_controller/metal/rendering.rb:10:in process_action' actionpack (3.2.8) lib/abstract_controller/callbacks.rb:18:inblock in process_action' 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' activesupport (3.2.8) lib/active_support/callbacks.rb:385:in _run_process_action_callbacks' activesupport (3.2.8) lib/active_support/callbacks.rb:81:in run_callbacks' actionpack (3.2.8) lib/abstract_controller/callbacks.rb:17:in process_action' actionpack (3.2.8) lib/action_controller/metal/rescue.rb:29:inprocess_action' actionpack (3.2.8) lib/action_controller/metal/instrumentation.rb:30:in block in process_action' activesupport (3.2.8) lib/active_support/notifications.rb:123:inblock in instrument' activesupport (3.2.8) lib/active_support/notifications/instrumenter.rb:20:in instrument' activesupport (3.2.8) lib/active_support/notifications.rb:123:in instrument' actionpack (3.2.8) lib/action_controller/metal/instrumentation.rb:29:in process_action' actionpack (3.2.8) lib/action_controller/metal/params_wrapper.rb:207:inprocess_action' activerecord (3.2.8) lib/active_record/railties/controller_runtime.rb:18:in process_action' actionpack (3.2.8) lib/abstract_controller/base.rb:121:inprocess' actionpack (3.2.8) lib/abstract_controller/rendering.rb:45:in process' actionpack (3.2.8) lib/action_controller/metal.rb:203:indispatch' 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 block in action' actionpack (3.2.8) lib/action_dispatch/routing/route_set.rb:73:in call' actionpack (3.2.8) lib/action_dispatch/routing/route_set.rb:73:indispatch' actionpack (3.2.8) lib/action_dispatch/routing/route_set.rb:36:in call' journey (1.0.4) lib/journey/router.rb:68:inblock in call' journey (1.0.4) lib/journey/router.rb:56:in each' journey (1.0.4) lib/journey/router.rb:56:incall' actionpack (3.2.8) lib/action_dispatch/routing/route_set.rb:600:in call' actionpack (3.2.8) lib/action_dispatch/middleware/best_standards_support.rb:17:in call' rack (1.4.1) lib/rack/etag.rb:23:in call' rack (1.4.1) lib/rack/conditionalget.rb:35:incall' 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:incall' actionpack (3.2.8) lib/action_dispatch/middleware/flash.rb:242:in call' rack (1.4.1) lib/rack/session/abstract/id.rb:205:incontext' rack (1.4.1) lib/rack/session/abstract/id.rb:200:in call' actionpack (3.2.8) lib/action_dispatch/middleware/cookies.rb:339:incall' 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' 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 run_3479256987463636693_call_4454778504255292268__callbacks' 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' activesupport (3.2.8) lib/active_support/callbacks.rb:81:in run_callbacks' actionpack (3.2.8) lib/action_dispatch/middleware/callbacks.rb:27:incall' 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' 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:incall' railties (3.2.8) lib/rails/rack/logger.rb:26:in call_app' railties (3.2.8) lib/rails/rack/logger.rb:16:incall' actionpack (3.2.8) lib/action_dispatch/middleware/request_id.rb:22:in call' rack (1.4.1) lib/rack/methodoverride.rb:21:incall' rack (1.4.1) lib/rack/runtime.rb:17:in call' activesupport (3.2.8) lib/active_support/cache/strategy/local_cache.rb:72:incall' rack (1.4.1) lib/rack/lock.rb:15:in call' actionpack (3.2.8) lib/action_dispatch/middleware/static.rb:62:incall' railties (3.2.8) lib/rails/engine.rb:479:in call' railties (3.2.8) lib/rails/application.rb:223:incall' rack (1.4.1) lib/rack/content_length.rb:14:in call' railties (3.2.8) lib/rails/rack/log_tailer.rb:17:incall' rack (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' /Users/ogonbat/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpserver.rb:94:in run' /Users/ogonbat/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/server.rb:191:in block in start_thread'

这是请求参数

{"utf8"=>"✓", "authenticity_token"=>"g44p+IPxvdm2ouGAE2u2dV/cCKK8uF6G3XLL4z26zrI=", "page"=>{"title"=>"zfdzfdsf", "contents"=>{"short_description"=>"

sdfdsf

", "large_description"=>"

dsfdsf

"}}, "commit"=>"Create"}

提前感谢您的帮助

最佳答案

如果页面has_many :contents,那么奇怪的是params[:page][:contents]是一个散列而不是一个数组...

解决不一致的一端或另一端。如果您有一个 has_many 关系,并且想要为其创建一个表单,请在主对象中为其预填充一些空项目,然后迭代它们,生成相应的字段。

您可以查看对 Nested forms in rails - accessing attribute in has_many relation 的所有回复了解您需要什么。

关于ruby-on-rails - 多态模型、Forms 和 AssociationTypeMismatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12887770/

相关文章:

ruby - 一行中的多个就地替换

php - 在 PHP 中定义 html 表单的选定选项

php 表单将动态值、项目 ID 传递给 mysql

ruby-on-rails - 需要建议 : Structure of Rails views for submenus?

mysql - 多个 Rails 引擎与一个 MySQL 服务器通信,用于水平扩展应用程序服务器

ruby-on-rails - Ruby URI::InvalidURIError: Bad URI(is not URI?) 除了编码

mysql - 如何从EventMachine返回MySQL查询结果?

ruby-on-rails - 让 child 、孙子进入层次结构

ruby - 将 to_hash(或 to_h)方法添加到 Struct 的优雅方式?

python - Django 表单,未提交表单