2010-04-18 12 views
8

pojawia się następujący błąd:Dlaczego otrzymuję AssociationTypeMismatch podczas tworzenia mojego obiektu modelu?

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"}}} 

Moja istotne modelu jest:

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 

Moim zdaniem:

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

moim zdaniem Kontroler:

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 nie jestem pewien, dlaczego tak jest nie rozpoznaje atrybutów kursu wymiany?

Dziękuję

Odpowiedz

20

Problemem jest to, że accepts_nested_attributes_for :exchange_rate szuka "exchange_rate_attributes" w params, nie "exchange_rate". Pomocnik fields_for zrobi to za Ciebie, ale musisz go zmienić na:

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

To działało. Dzięki stary. – Maxm007

Powiązane problemy