为什么在创建模型对象时会获得AssociationTypeMismatch?

时间:2010-04-18 17:16:17

标签: ruby-on-rails nested-forms

我收到以下错误:

ActiveRecord::AssociationTypeMismatch in ContractsController#create

ExchangeRate(#2183081860) expected, got HashWithIndifferentAccess(#2159586480)

Params:
{"commit"=>"Create",
 "authenticity_token"=>"g2/Vm2pTcDGk6uRas+aTgpiQiGDY8lsc3UoL8iE+7+E=",
 "contract"=>{"side"=>"BUY",
 "currency_id"=>"488525179",
 "amount"=>"1000",
 "user_id"=>"633107804",
 "exchange_rate"=>{"rate"=>"1.7"}}}

我的相关模型是:

class Contract < ActiveRecord::Base
  belongs_to :currency
  belongs_to :user
  has_one :exchange_rate
  has_many :trades

  accepts_nested_attributes_for :exchange_rate
end

class ExchangeRate < ActiveRecord::Base
  belongs_to :denccy, :class_name=>"Currency"
  belongs_to :numccy, :class_name=>"Currency"
  belongs_to :contract
end

我的观点是:

<% form_for @contract do |contractForm| %>


    Username: <%= contractForm.collection_select(:user_id, User.all, :id, :username) %> <br>


    B/S: <%= contractForm.select(:side,options_for_select([['BUY', 'BUY'], ['SELL', 'SELL']], 'BUY')) %> <br>


    Currency: <%= contractForm.collection_select(:currency_id, Currency.all, :id, :ccy) %> <br> <br>


    Amount: <%= contractForm.text_field :amount %> <br>

    <% contractForm.fields_for @contract.exchange_rate do |rateForm|%>
        Rate: <%= rateForm.text_field :rate %> <br>
    <% end %>

    <%= submit_tag :Create %>

<% end %>

我的视图控制器:

class ContractsController < ApplicationController

  def new
    @contract = Contract.new
    @contract.build_exchange_rate


    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @contract }
    end

  end

  def create
    @contract = Contract.new(params[:contract])

    respond_to do |format|
      if @contract.save
        flash[:notice] = 'Contract was successfully created.'
        format.html { redirect_to(@contract) }
        format.xml  { render :xml => @contract, :status => :created, :location => @contract }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @contract.errors, :status => :unprocessable_entity }
      end
    end
  end

我不确定为什么它不承认汇率属性?

谢谢

1 个答案:

答案 0 :(得分:24)

问题在于accepts_nested_attributes_for :exchange_rate在参数中查找"exchange_rate_attributes",而不是"exchange_rate"fields_for助手将为您执行此操作,但您必须将其更改为:

<% contractForm.fields_for :exchange_rate do |rateForm|%>