2010-04-18 1 views
8

я получаю следующее сообщение об ошибке:Почему при создании объекта модели я получаю AssociationTypeMismatch?

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

Мой View Controller:

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 

I Не знаю, почему не признавая атрибуты обменного курса?

Спасибо

ответ

20

Проблема заключается в том, что accepts_nested_attributes_for :exchange_rate ищет "exchange_rate_attributes" в Params, а не "exchange_rate". Помощник fields_for сделает это за вас, но вы должны изменить его на:

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

Это сработало. Спасибо друг. – Maxm007

 Смежные вопросы

  • Нет связанных вопросов^_^