[Rails] Errore ActiveRecord::AssociationTypeMismatch

Ciao a tutti,
Sto usando rails 3.2 ed ho un grossissimo problema con l’errore
riportato nel subject e non ho
la più pallida idea di come risolverlo.
Riassumendo sto cercando di utilizzare uno stesso form per inserire i
dat in due modelli diversi fra cui c’è una relazione has_one.

I due model sono:

class Ad < ActiveRecord::Base

default_scope order(‘created_at DESC’)

belongs_to :user
has_one :location
accepts_nasted_attributes_for :location

validates :title, :description, :tags, :presence => true

end

class Location < ActiveRecord::Base
belongs_to :user

   attr_accessible  :address_1,
    :address_2,
    :city,
    :state_province_region,
    :zip_postal_code,
    :country,
    :position,
    :user_id

validates :address_1, :city, :state_province_region, :zip_postal_code,
:country, :user_id, :presence => true
validates :zip_postal_code, :numericality => true

end

e questo è il form (completo):

<%= form_for(@ad) do |f| %>
<% if @ad.errors.any? %>


<%= pluralize(@ad.errors.count, “error”) %> prohibited this ad
from being saved:

  <ul>
  <% @ad.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
  </ul>
</div>

<% end %>

<%= f.label :title %>
<%= f.text_field :title %>
<%= f.label :description %>
<%= f.text_area :description %>
<%= f.label :tags, "Comma separated list of tags" %>
<%= f.text_field :tags %>
<%= f.fields_for @location do |fl| %>
  <div class="field">
    <div><%= fl.label :address_1 %><br />
    <%= fl.text_field :address_1 %>
  </div>

  <div class="field">
    <div><%= fl.label :address_2 %><br />
    <%= fl.text_field :address_2 %>
  </div>

  <div class="field">
    <div><%= fl.label :city %><br />
    <%= fl.text_field :city %>
  </div>

  <div class="field">
    <div><%= fl.label :state_province_region %><br />
    <%= fl.text_field :state_province_region %>
  </div>

  <div class="field">
    <div><%= fl.label :zip_postal_code %><br />
    <%= fl.text_field :zip_postal_code %>
  </div>

  <div class="field">
    <div><%= fl.label :country %><br />
    <%= fl.country_select(:country, [ "France", "Germany", "Italy",

“United Kingdom”, “United States”, “Spain”]) %>



<% end %>
<%= f.submit %>
<% end %>

Grazie a tutti per l’aiuto in anticipo

Ciao,

Dallo stralcio che hai postato Location non ha definito un “belongs_to”
verso Ad.

Vedi se questo il problema :D.

Matteo

L’ho aggiunto ma le cose non sono cambiate.
Ho iniziato a vedere anche questo errore (con o senza il belongs_to :ad)
nel location model

undefined method `accepts_nasted_attributes_for’ for
#Class:0x007faa5dcc4c50

Prova a vedere la soluzione che suggeriscono qui:

Magari puoi applicarla.
Paolo

On 28 February 2012 11:55, Nimbuzz 77 [email protected] wrote:

Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


“… static analysis is fun, again!”

life from an application security guy ~> http://thesp0nge.com

Come ha fatto notare Andrea avevo sbagliato a scrivere il metodo.
Ho aggiunto anche un
attr_accessor :location

al model dell’Ad, il risultato è che ora l’errore di associazione non
c’è più, ma comunque al modello location tutti i parametri arrivano
vuoti.

Sicuro non sia ‘accepts_nested_attributes_for’ invece che ’
accepts_nasted_attributes_for’ ?
Andrea

Da: [email protected]
A: [email protected]
Cc:
Data: Tue, 28 Feb 2012 11:55:11 +0100
Oggetto: Re: [ruby-it] [Rails] Errore
ActiveRecord::AssociationTypeMismatch

Se il form c’è ma viene restituito vuoto è un problema del form o
meglio, del nome attribuitogli. Controlla meglio la view

2012/2/28 Nimbuzz 77 [email protected]:
[cut]

al model dell’Ad, il risultato che ora l’errore di associazione non
c’ pi, ma comunque al modello location tutti i parametri arrivano
vuoti.

La view del form viene richiamata sia dall’azione edit che dall’azione
new, giusto?
Puoi postare il codice del controller per le azioni new e edit?

Secondo me ti basterebbe accodare un @ad.build_location dopo @ad =
Ad.new all’interno della definizione di new.

Maurizio

Allora, io ho risolto, ma credo che tutti i vantaggi di rails non li ho
minimamente utilizzati, come faccio a dirlo? beh, semplice, commentando
accepts_nasted_attributes_for tutto funziona lo stesso.
Mi tocca di fare un bel po’ di ridondanza durante il salvataggio
inoltre la
validazione dell’intero form avviene in 2 fasi (è la cosa che mi scoccia
di più) cioè se all’utente vengono visualizzati solo gli errori della
prima parte, poi una volta corretta la prima parte allora la view
segnala gli errori nella seconda.

Vi riposto i modelli:

class Ad < ActiveRecord::Base
require ‘redisutils.rb’

default_scope order(‘created_at DESC’)

belongs_to :user
has_one :location

accepts_nested_attributes_for :location
attr_accessor :location

validates :title, :description, :tags, :presence => true

public

def save_tags

end
end

class Location < ActiveRecord::Base
include Geokit::Geocoders

belongs_to :user
belongs_to :ad, :dependent => :destroy

attr_accessible :address_1,
:address_2,
:city,
:state_province_region,
:zip_postal_code,
:country,
:position,
:user_id

before_save :generate_location

validates :address_1,
:city,
:state_province_region,
:zip_postal_code,
:country,
:user_id, :presence => true
validates :zip_postal_code, :numericality => true

def generate_location

end

def exist?

end
end

P.S. vi allego l’intero controller.
P.P.S. Utilizzo sia devise che cancan (ovviamente in User)

Ah, se load_and_authorize_resource si preoccupa di allocare
inizialmente @ad allora in ads_controller#new ti basta solo sostituire

@location = Location.new

con @ad.build_location

2012/2/28 maurizio de magnis [email protected]:

mmh, ma scusa, perche’ in ads_controller#new hai istanziato Location?

def new
@location = Location.new

respond_to do |format|
format.html # new.html.erb
format.json { render json: @ad }
end
end

essendo il controller della risorsa Ad dovresti sostituire

@location = Location.new

con

@ad = Ad.new

e subito dopo allocare il “placeholder” per la relazione has_one:

@ad.build_location

e nella view del form:

<%= f.fields_for @location do |fl| %>

se non erro dovrebbe essere sostituito con:

<%= f.fields_for @ad.location do |fl| %>

e quindi potresti tornare alla definizione “classica” di
ads_controller#create.

2012/2/28 Nimbuzz 77 [email protected]: