1

我收到此错误以前从未见过,已尝试此处类似问题的所有解决方案,我正在尝试从预先填充的议会模型中选择租户居住的议会,使用通过议会历史,表格显示但是,当我按下提交时,我不断收到此错误。感谢您对这个问题的任何帮助。

Started PUT "/properties/6/build/council" for 127.0.0.1 at 2013-08-18 22:32:55 +0100
Processing by Properties::BuildController#update as HTML
  Parameters: {"utf8"=>"✓",    "authenticity_token"=>"wBWQaxtBioqzGLkhUrstqS+cFD/xvEutXnJ0jWNtSa0=", "property"=>   {"council_history"=>{"id"=>"1"}}, "commit"=>"Save Property[council history]",  "property_id"=>"6", "id"=>"council"}
  Property Load (0.3ms)  SELECT "properties".* FROM "properties" WHERE "properties"."id" =   ? LIMIT 1  [["id", "6"]]
   (0.1ms)  begin transaction
   (  0.1ms)  rollback transaction
 Completed 500 Internal Server Error in 62ms
 ActiveRecord::AssociationTypeMismatch - CouncilHistory(#70308444526760) expected, got          ActiveSupport::HashWithIndifferentAccess(#70308443935640):
activerecord (3.2.13) lib/active_record/associations/association.rb:204:in `raise_on_type_mismatch'
  activerecord (3.2.13) lib/active_record/associations/has_one_association.rb:8:in `replace'
  activerecord (3.2.13) lib/active_record/associations/singular_association.rb:17:in `writer'
  activerecord (3.2.13) lib/active_record/associations/builder/association.rb:51:in `block in define_writers'
  activerecord (3.2.13) lib/active_record/attribute_assignment.rb:94:in `block in assign_attributes'
  activerecord (3.2.13) lib/active_record/attribute_assignment.rb:93:in `assign_attributes'
  activerecord (3.2.13) lib/active_record/persistence.rb:216:in `block in update_attributes'
  activerecord (3.2.13) lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'
  activerecord (3.2.13)    lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
  activerecord (3.2.13) lib/active_record/transactions.rb:208:in `transaction'
  activerecord (3.2.13) lib/active_record/transactions.rb:311:in `with_transaction_returning_status'
  activerecord (3.2.13) lib/active_record/persistence.rb:215:in `update_attributes'
  app/controllers/properties/build_controller.rb:23:in `update'

属性模型

class Property < ActiveRecord::Base
  attr_accessible  :name, :address_attributes, :tenants_attributes, :meter_attributes,  :council_history, :council_history_attributes, :property_id, :council_id, :status
  belongs_to :user 

  has_one :council_history
  accepts_nested_attributes_for :council_history

  has_one :council, through: :council_history
  accepts_nested_attributes_for :council

end

理事会模式

class Council < ActiveRecord::Base
  attr_accessible :CouncilEmail, :name, :CouncilTel

  has_many   :council_history

  has_many   :properties, :through => :council_history 
end

理事会历史模型

 class CouncilHistory < ActiveRecord::Base
  attr_accessible :council_id, :property_id, :vacant 

  belongs_to :council

  belongs_to :property

 end

选择理事会查看表格

<h1>Select Council</h1>



<%= simple_form_for @property, :url => url_for(:action => 'update', :controller =>   'properties/build'), :method => 'put' do |f| %>
  <%= f.simple_fields_for :council_history do |builder| %>
  <%= builder.input :id, :collection => Council.all %>
  <%= builder.submit %>
 <% end %>
<% end %>

构建属性控制器

class Properties::BuildController < ApplicationController
  include Wicked::Wizard

   steps :tenant, :meter, :council, :confirmed 

  def show
    @property = Property.find(params[:property_id])
    @tenants = @property.tenants.new(params[:tenant_id])
    @meter = @property.build_meter
    @council = @property.build_council_history
    render_wizard
  end

  def edit
    @property = Property.find(params[:property_id])
  end


  def update
    @property = Property.find(params[:property_id])
    params[:property][:status] = step.to_s
    params[:property][:status] = 'active' if step == steps.last
    @property.update_attributes(params[:property])
    render_wizard @property
  end
end
4

2 回答 2

1

在您的Property模型中attr_accessible :council_history,尝试将其删除。

我没有对此进行测试,但我相信问题是因为你有has_one :council_historysimple_fields_for使用它:council_history而不是生成council_history_attributes参数。

于 2013-08-18T23:02:59.210 回答
1

就我而言,这与我命名强参数的方式密切相关。

model_attributesmodel您的实际型号名称在哪里。以防万一这是我的代码:

父控制器强参数定义

def well_params params.require(:well).permit(:name, :well_number, :api_number, :company_id, :permit_date, :spud_date, :inclination, :formation, :lateral_length, :lateral_depth, :measured_depth, stages_attributes: [:id, :stage_number, :stage_bottom, :start_date, :duration, :fluid, :proppant, :project_id, :created_at, :updated_at, :stage_top,:well_id] ) end

父模型定义:

class Well < ApplicationRecord has_many :stages accepts_nested_attributes_for :stages ...

子模型定义:

class Stage < ApplicationRecord belongs_to :well ...

正如你所看到的,我的修复只是简单地重命名现在拥有的东西stages_attributes,之前它只是stages而且well_stages你不能这样做,而是必须像在片段上一样stages_attributes

希望这可以帮助!

PS:我在这里找到了解决方案,如果您查看表单操作的输出,它描述了如何编写复杂表单,基本上告诉您按照我的描述使用它

{ 'person' => { 'name' => 'John Doe', 'addresses_attributes' => { '0' => { 'kind' => 'Home', 'street' => '221b Baker Street' }, '1' => { 'kind' => '办公室', 'street' => '31 Spooner Street' } } } }

它会告诉你addresses_attributes再次使用...xxx_attributes

于 2017-12-18T20:52:31.963 回答