我收到以下错误:
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
我不确定为什么它不承认汇率属性?
谢谢
答案 0 :(得分:24)
问题在于accepts_nested_attributes_for :exchange_rate
在参数中查找"exchange_rate_attributes"
,而不是"exchange_rate"
。 fields_for
助手将为您执行此操作,但您必须将其更改为:
<% contractForm.fields_for :exchange_rate do |rateForm|%>