Forum: Italian Ruby user group Models multipli in un form

Posted by Paola Andriani (corto_maltese)
on 2010-02-28 17:36
Dunque, ho provato a seguire le guide per realizzare un form che
modifichi più models ma non ci sono riuscita.

Ho due tabelle Persone e Territori, con una relazione molti a molti, una
persona può amministrare più territori, un territorio può essere
amministrato nel tempo da più persone. Ho fatto di conseguenza la
tabella di collegamento AmministrazioneTerritori.

Ecco le tre tabelle:

class Persona < ActiveRecord::Base
  has_many :amministrazioni_territori
  has_many :territori, :through => :amministrazioni_territori
end

class Territorio < ActiveRecord::Base
   has_many :amministrazioni_territori
   has_many :persone, :through => :amministrazioni_territori
 end

class AmministrazioneTerritorio < ActiveRecord::Base
  belongs_to :persona
  belongs_to :territorio
end

------------------------

Questi i campi delle tabelle:

  create_table "amministrazione_territori", :force => true do |t|
    t.integer  "persona_id",             :null => false
    t.integer  "territorio_id",          :null => false
    t.string   "inizio_amministrazione"
    t.string   "fine_amministrazione"
    t.string   "carica"
    t.datetime "created_at"
    t.datetime "updated_at"
  end


class CreatePersone < ActiveRecord::Migration
  def self.up
    create_table :persone do |t|
      t.string :nome
      t.string :famiglia
      t.string :patronimico
      t.string :variazione_nome
      t.string :sesso
      t.string :ind_temp1
      t.string :int_nascita1
      t.string :int_nascita2
      t.string :ind_temp2
      t.string :int_morte1
      t.string :int_morte2
      t.text :note

      t.timestamps
    end
  end

  def self.down
    drop_table :persone
  end
end

class CreateTerritori < ActiveRecord::Migration
  def self.up
    create_table :territori do |t|
      t.string :denominazione
      t.string :variazione_nome
      t.string :articolazione_territoriale
      t.text :descrizione

      t.timestamps
    end
  end

  def self.down
    drop_table :territori
  end
end


Vorrei quindi fare un form che mi permetta di:
1) inserire tutti i dati anagrafici della persona in questione
2) mi permetta di definire quali territori ha amministrato e in che
periodo
3) l'elenco dei territori amministrati venga recuperato dalla lista dei
territori già presenti nella tabella omonima


L'ho così realizzato (in realtà ho cominciato modificando il form di
modifica, in quanto volevo prima che fosse possibile aggiungere dati ad
una persona già esistente, poi farlo anche per una persona creata ex
novo):

<h1>Modifica persona</h1>

<% form_for(@persona) do |f| %>
  <%= f.error_messages %>
<fieldset>
  <legend>Dati anagrafici</legend>
  <p>
    <%= f.label :nome %><br />
    <%= f.text_field :nome %>
  </p>
  <p>
    <%= f.label :famiglia %><br />
    <%= f.text_field :famiglia %>
  </p>
  <p>
    <%= f.label :patronimico %><br />
    <%= f.text_field :patronimico %>
  </p>
  <p>
    <%= f.label :variazione_nome %><br />
    <%= f.text_field :variazione_nome %>
  </p>
  <p>
    <%= f.label :sesso %><br />
    <%= f.text_field :sesso %>
  </p>
 <p> Intervallo date di nascita <br />
   <%= f.select(:ind_temp1, %w[ v. p. d.], { :include_blank => true })
%> <%= f.text_field :int_nascita1, :size => 10 %>
  -
    <%= f.text_field :int_nascita2, :size => 10 %>
  </p>
  <p>Intervallo date di morte <br />
    <%= f.select(:ind_temp2, %w[ v. p. d. q.], { :include_blank => true
}) %><%= f.text_field :int_morte1, :size => 10 %>
  -
    <%= f.text_field :int_morte2, :size => 10 %>
  </p>


<fieldset>
<legend>Territorio di competenza<legend>
  <% fields_for @amministrazione_territorio do |t| %>

  <p>
  <%= t.label :carica %>
  <%= t.text_field :carica%>
  </p>

  <p>
  <%= t.label :inizio_amministrazione %>
  <%= t.text_field :inizio_amministrazione%>
  </p>

  <p>
  <%= t.label :fine_amministrazione %>
  <%= t.text_field :fine_amministrazione%>
  </p>
  <% end %>

</fieldset>

<p>
  <%= f.label :note %><br />
  <%= f.text_area :note %>
</p>

</fieldset>

  <p>
    <%= f.submit 'Update' %>
  </p>
<% end %>

<%= link_to 'Show', @persona %> |
<%= link_to 'Back', persone_path %>


Le domande sono:
nella tabella AmministrazioneTerritorio ovviamente devo associare l'id
della persona e l'id del territorio? come faccio a passarglieli?
come faccio a recuperare nel menù a tendina i dati della tabella
territori?
così?
  <p>
  <%= t.label :territorio_id %>
  <%= @territori = Territorio.find(:all, :order => "name").map {|t|
[t.name, t.id] }
    f.select(:name, @territori) %>
  </p>

Grazie in anticipo a chiunque abbia voglia di aiutarmi! Sarei persa
senza di voi!
paola
Posted by Marco Mastrodonato (marcomd)
on 2010-03-01 10:23
Hai letto questa?
http://it.asciicasts.com/episodes/196-nested-model-form-parte-1

Nel controller:
@territori = Territorio.find(:all, :order => "name")

Nella view dentro fields for:
f.collection_select  :territorio_id, @territori

Non ho provato, prendilo come spunto
Posted by Paola Andriani (corto_maltese)
on 2010-03-01 15:32
Grazie mille per il link, l'ho trovato molto utile, per poterlo 
"provare" ho dovuto fare l'update a rails 2.3.5 e installare 
esplicitamente la gem rack 1.0.1 (altrimenti dava errore).
Sto finendo di seguire il tutorial, poi provo ad applicare qualcosa e ti 
dico cosa ne viene fuori!
Grazie ancora!!!
Posted by Paola Andriani (corto_maltese)
on 2010-03-01 18:15
Riprovo:

Vorrei che il form che ho fatto riempisse sia i campi della tabella 
persone che quelli della tabella amministrazione_territori.
La prima parte è facile, la seconda l'ho fatta così:

partial: _form_html.erb

<% f.fields_for :amministrazione_territori do |builder| %>
   <%= render 'amministrazione', :f => builder %>
 <% end %>

_amministrazione.html.erb

  <p>
  <%= f.label :territorio_id %><br />
  <%= @territori = Territorio.find(:all, :order => "denominazione")
     f.collection_select(:territorio_id, @territori)%>
  </p>

  <p>
  <%= f.label :carica %><br />
  <%= f.text_field :carica %>
  </p>

  <p>
  <%= f.label :inizio_amministrazione %><br />
  <%= f.text_field :inizio_amministrazione %>
  </p>

  <p>
  <%= f.label :fine_amministrazione %><br />
  <%= f.text_field :fine_amministrazione %>
  </p>


Gli ultimi 3 campi sono relativamente facili, sono della tabella 
amministrazione_territori e si riempiono normalmente. Il primo invece 
vorrei riempirlo con l'id del territorio recuperando il valore dalla 
tabella territori, con una selection list. Ma così non va bene. E poi 
un'altra domanda, la tabella amministrazione_territori è una tabella di 
associazione di id, ossia associa ad ogni persona un territorio, l'id 
della persona lo prende in automatico o devo passargli anche quello?
grazie come al solito!
p



Posted by Paola Andriani (corto_maltese)
on 2010-03-02 10:05
Ho provato così:

persone_controller.rb

class PersoneController < ApplicationController
  # GET /persone
  # GET /persone.xml
  def index
    @persone = Persona.all :order => :nome
    @territori = Territorio.all :order => :denominazione


_amministrazione.html.erb

  <p>
  <%= f.label :territorio_id %><br />
  <%= f.collection_select(:amministrazione_territorio, :territorio_id, 
@territori, :id, {:prompt => "select territorio"}) %>
  </p>

ma mi da errore "undefined method `map' for :territorio_id:Symbol"

e poi solo così:

  <p>
  <%= f.label :territorio_id %><br />
  <%= f.select("amministrazione_territorio", :territorio_id, 
Territorio.all.collect, {|t| [ t.denominazione, t.id ] }, {:prompt => 
"select territorio"}) %>
  </p>

ma anche questo mi da errore.
Non so più cosa fare...
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 10:48
class Persona < ActiveRecord::Base
  has_many :amministrazione_territori
  has_many :territori, :through => :amministrazione_territori
  accepts_nested_attributes_for :territori
  accepts_nested_attributes_for :amministrazione_territori
 end

class Territorio < ActiveRecord::Base
   has_many :amministrazione_territori
   has_many :persone, :through => :amministrazione_territori
   accepts_nested_attributes_for :persone
   accepts_nested_attributes_for :amministrazione_territori
end


non avevo aggiunto gli accepts nested attributes for, ora l'ho fatto e 
mi da un altro errore "uninitialized constant 
Persona::AmministrazioneTerritori".
Posted by Pietro Giorgianni (giorgian)
on 2010-03-02 10:58
(Received via mailing list)
Il 02 marzo 2010 10.48, Paola Andriani <nuvola@elbalink.it> ha scritto:
> class Persona < ActiveRecord::Base
>  has_many :amministrazione_territori
> non avevo aggiunto gli accepts nested attributes for, ora l'ho fatto e
> mi da un altro errore "uninitialized constant
> Persona::AmministrazioneTerritori".
Ma tu gliel'hai spiegato che il plurale di Territorio è Territori e
non Territorios?

Da quello che ho capito (ma non ho mai provato, finora ho sempre
seguito le convenzioni rails), dovresti inserire in
config/environments.rb qualcosa tipo:

Inflector.inflections do |inflect|
  inflect.irregular ‘territorio’, ‘territori’
end

Poi non so se è abbastanza furbo da farsi bastare questo o se invece
richiede anche

  inflect.irregular ‘amministrazione_territorio’, 
‘amministrazione_territori’

o qualcosa del genere.


pietro
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 11:11
Pietro Giorgianni wrote:
> Il 02 marzo 2010 10.48, Paola Andriani <nuvola@elbalink.it> ha scritto:
>> class Persona < ActiveRecord::Base
>>  has_many :amministrazione_territori
>> non avevo aggiunto gli accepts nested attributes for, ora l'ho fatto e
>> mi da un altro errore "uninitialized constant
>> Persona::AmministrazioneTerritori".
> Ma tu gliel'hai spiegato che il plurale di Territorio è Territori e
> non Territorios?
> 
> Da quello che ho capito (ma non ho mai provato, finora ho sempre
> seguito le convenzioni rails), dovresti inserire in
> config/environments.rb qualcosa tipo:
> 
> Inflector.inflections do |inflect|
>   inflect.irregular ‘territorio’, ‘territori’
> end
> 
> Poi non so se è abbastanza furbo da farsi bastare questo o se invece
> richiede anche
> 
>   inflect.irregular ‘amministrazione_territorio’, 
> ‘amministrazione_territori’
> 
> o qualcosa del genere.
> 
> 
> pietro


Si si certo, ho usato le espressioni regolari per fare tutta la 
grammatica che mi serviva...so che potevo lasciare tutto in inglese ma 
volevo provare.

ActiveSupport::Inflector.inflections do |inflect|

  inflect.plural(/a$/, "e")
  inflect.plural(/o$/, "i")
  inflect.plural(/e$/, "i")
  inflect.plural(/io$/, "i")
  inflect.plural(/(z)io$/, '\1ii')
  inflect.plural(/([cg])a$/, '\1he')



  inflect.singular(/e$/, "a")
  inflect.singular(/(font|attestazion|coniug|genitor)i$/, '\1e')
  inflect.singular(/([cg])he$/, '\1a')
  inflect.singular(/(territor)i$/, '\1io')


end


>> "amministrazione_territori".singularize
=> "amministrazione_territorio"
>> "amministrazione_territorio".pluralize
=> "amministrazione_territori"


dici che è un problema di questo tipo?

Posted by Pietro Giorgianni (giorgian)
on 2010-03-02 11:16
(Received via mailing list)
Il 02 marzo 2010 11.11, Paola Andriani <nuvola@elbalink.it> ha scritto:
>>> "amministrazione_territori".singularize
> => "amministrazione_territorio"
>>> "amministrazione_territorio".pluralize
> => "amministrazione_territori"
>
> dici che è un problema di questo tipo?
Non saprei, bisogna fare delle prove. Da console,
Persona.first.amministrazione_territori funziona?


pietro
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 11:19
Pietro Giorgianni wrote:
> Il 02 marzo 2010 11.11, Paola Andriani <nuvola@elbalink.it> ha scritto:
>>>> "amministrazione_territori".singularize
>> => "amministrazione_territorio"
>>>> "amministrazione_territorio".pluralize
>> => "amministrazione_territori"
>>
>> dici che � un problema di questo tipo?
> Non saprei, bisogna fare delle prove. Da console,
> Persona.first.amministrazione_territori funziona?
> 
> 
> pietro

no mi da lo stesso errore.
Posted by Pietro Giorgianni (giorgian)
on 2010-03-02 11:31
(Received via mailing list)
Il 02 marzo 2010 11.19, Paola Andriani <nuvola@elbalink.it> ha scritto:
>> Persona.first.amministrazione_territori funziona?
> no mi da lo stesso errore.

Ok, allora: se, da console, AmministrazioneTerritorio funziona, è 
quasi certamente questione di inflessione, e in quel caso temo di non
poterti essere di aiuto, avendo sempre e solo usato l'inglese. Se
invece AmministrazioneTerritorio non funziona, bisognerà capire il
perché.

pietro
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 11:44
Pietro Giorgianni wrote:
> Il 02 marzo 2010 11.19, Paola Andriani <nuvola@elbalink.it> ha scritto:
>>> Persona.first.amministrazione_territori funziona?
>> no mi da lo stesso errore.
> 
> Ok, allora: se, da console, AmministrazioneTerritorio funziona, � 
quasi certamente questione di inflessione, e in quel caso temo di non
> poterti essere di aiuto, avendo sempre e solo usato l'inglese. Se
> invece AmministrazioneTerritorio non funziona, bisogner� capire il
> perch�.

> pietro

Non ho capito se metto nella console
>> Persona.first.amministrazione_territori

l'errore che mi da è questo, ossia lo stesso che a video:

NameError: uninitialized constant Persona::AmministrazioneTerritori
  from 
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:105:in 
`const_missing'
  from 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2199:in 
`compute_type'
  from 
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.5/lib/active_support/core_ext/kernel/reporting.rb:11:in 
`silence_warnings'
  from 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2195:in 
`compute_type'
  from 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/reflection.rb:156:in 
`send'
  from 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/reflection.rb:156:in 
`klass'
  from 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/reflection.rb:187:in 
`quoted_table_name'
  from 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/has_many_association.rb:97:in 
`construct_sql'
  from 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:21:in 
`initialize'
  from 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations.rb:1300:in 
`new'
  from 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations.rb:1300:in 
`amministrazione_territori'
  from (irb):5
>> 


Ora ho riprovato a fare solo quel pezzettino di progetto ossia le sole 
tre tabelle people, lands, administrations in inglese appunto, ma sono 
arrivata allo stesso errore di prima ossia "undefined method `map' for 
:land_id:Symbol" ma questa volta i nested attributes li ho già messi. 
:(((((
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 12:16
Riprovo a rifare tutto il percorso:

Allora ho tre tabelle People, Lands e Administrations (in realtà ho 
sbagliato a scrivere e l'ho chiamata Amministrations, ma pazienza). Le 
prime due hanno una relazione molti a molti, una
persona può amministrare più territori, un territorio può essere 
amministrato nel tempo da più persone. Ed ecco quindi la ragione di 
esistere della tabella Administrations.

Ed ecco le 3 tabelle con i riferimenti alle chiavi esterne.
class CreatePeople < ActiveRecord::Migration
  def self.up
    create_table :people do |t|
      t.string :nome
      t.string :famiglia
      t.string :patronimico
      t.string :variazione_nome
      t.string :sesso

      t.timestamps
    end
  end

  def self.down
    drop_table :people
  end
end

class CreateLands < ActiveRecord::Migration
  def self.up
    create_table :lands do |t|
      t.string :denominazione
      t.string :variazione_nome
      t.string :articolazione_territoriale
      t.text :descrizione

      t.timestamps
    end
  end

  def self.down
    drop_table :lands
  end
end

class CreateAmministrations < ActiveRecord::Migration
  def self.up
    create_table :amministrations do |t|
      t.integer :person_id, :null => false, :options =>
      "CONSTRAINT fk_amministration_people REFERENCES people(id)"
      t.integer :land_id, :null => false, :options =>
      "CONSTRAINT fk_amministration_lands REFERENCES lands(id)"
      t.string :inizio_amministrazione
      t.string :fine_amministrazione
      t.string :carica

      t.timestamps
    end
  end

  def self.down
    drop_table :amministrations
  end
end


Ho impostato le relazioni has_many e belongs_to

class Amministration < ActiveRecord::Base
  belongs_to :person
  belongs_to :land
end

class Land < ActiveRecord::Base
  has_many :amministrations
  has_many :people, :through => :amministrations
  accepts_nested_attributes_for :people
  accepts_nested_attributes_for :amministrations

end

class Person < ActiveRecord::Base
  has_many :amministrations
  has_many :lands, :through => :amministrations
  accepts_nested_attributes_for :lands
  accepts_nested_attributes_for :amministrations
end



Dopodichè vorrei in un unico form impostare una nuova persona e dire 
anche che carica ha in un determinato territorio, quindi il form deve 
completare la tabella People, recuperare l'elenco e gli id dei territori 
già inseriti e completare la tabella Administrations con una data di 
inizio amm, una data di fine amm, una carica (conte marchese o 
quant'altro) e l'accoppiata id del territorio e id della persona.

Il form l'ho fatto così:

<h1>New person</h1>

<% form_for(@person) do |f| %>
  <%= f.error_messages %>
<fieldset>
  <legend>Dati anagrafici</legend>
  <p>
    <%= f.label :nome %><br />
    <%= f.text_field :nome %>
  </p>
  <p>
    <%= f.label :famiglia %><br />
    <%= f.text_field :famiglia %>
  </p>
  <p>
    <%= f.label :patronimico %><br />
    <%= f.text_field :patronimico %>
  </p>
  <p>
    <%= f.label :variazione_nome %><br />
    <%= f.text_field :variazione_nome %>
  </p>
  <p>
    <%= f.label :sesso %><br />
    <%= f.text_field :sesso %>
  </p>

</fieldset>


<fieldset>
<legend>Territorio di competenza</legend>

<% f.fields_for :amministration do |builder| %>
   <p>
<%= builder.label :land_id %><br />
<%= builder.collection_select(:amministration, :land_id, @lands, :id, 
{:prompt => "select territorio"}) %>
</p>

<p>
<%= builder.label :carica %><br />
<%= builder.text_field :carica %>
</p>

<p>
<%= builder.label :carica %><br />
<%= builder.text_field :carica %>
</p>

<p>
<%= builder.label :inizio_amministrazione %><br />
<%= builder.text_field :inizio_amministrazione %>
</p>

<p>
<%= builder.label :fine_amministrazione %><br />
<%= builder.text_field :fine_amministrazione %>
</p>
 <% end %>

  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

<%= link_to 'Back', people_path %>


In tutto questo non ho ancora capito come passargli l'id della persone o 
se gli viene passata in automatico.

Per @lands in questa parte del form
<%= builder.label :land_id %><br />
<%= builder.collection_select(:amministration, :land_id, @lands, :id, 
{:prompt => "select territorio"}) %>
</p>

ho messo nel people_controller

  def index
    @people = Person.all
    @lands = Land.all :order => :denominazione

ma non so se vada bene o meno.
Inoltre mi sembra di aver capito di dover aggiungere un

  def new
    @person = Person.new
    @amministration = Amministration.new

  def edit
    @person = Person.find(params[:id])
    @amministration = Amministration.new(params[:amministration])

idem al def create, al def update e non so al def destroy.

Fatto tutto ciò mi da errore "undefined method `map' for 
:land_id:Symbol"
Come ne esco? Dove ho sbagliato?




Posted by Pietro Giorgianni (giorgian)
on 2010-03-02 12:29
(Received via mailing list)
Il 02 marzo 2010 12.16, Paola Andriani <nuvola@elbalink.it> ha scritto:
> <%= builder.collection_select(:amministration, :land_id, @lands, :id, {:prompt => "select territorio"}) %>
>
> Fatto tutto ciò mi da errore "undefined method `map' for
> :land_id:Symbol"
> Come ne esco? Dove ho sbagliato?

Parto dalla fine, scusa ma ora non posso ricontrollare tutto.

Qui l'errore è che stai passando un parametro di troppo, 
cioè :amministration.

I form helper, infatti, possono essere usati o "da soli", ad esempio
<%= text_field :object, :method %>

oppure associati all'oggetto form_for o fields_for:
<%= f.text_field :method %>

Nel secondo caso non è necessario specificare l'oggetto.

Quel messaggio di errore, undefined method map for :land_id:Symbol,
significa che ha provato a trattare l'oggetto :land_id (che è un
Symbol) come un array (il metodo map è un metodo di array).

In questo caso dovresti usare qualcosa tipo:
<%= builder.collection_select(:land_id, @lands, :id, :denominazione,
{:prompt => "select territorio"}) %>

Ovvero:
:land_id è il nome del campo;
@lands è la collezione di oggetti da usare per riempire la select;
:id è il metodo di Land da usare come valore della select (e in
effetti quello che ti serve nel form è l'id);
:denominazione è il metodo di Land da usare per mostrare ciò che deve
apparire all'utente per ogni scelta.


pietro
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 12:38
Grazie per la pazienza, intanto!!
Ho sostituito <%= builder.collection_select(:amministration, :land_id, 
@lands, :id,
{:prompt => "select territorio"}) %>

con <%= builder.collection_select(:land_id, @lands, :id, :denominazione,
{:prompt => "select territorio"}) %>

e adesso mi da

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.map
Posted by Pietro Giorgianni (giorgian)
on 2010-03-02 12:46
(Received via mailing list)
2010/3/2 Paola Andriani <nuvola@elbalink.it>:
> You have a nil object when you didn't expect it!
> You might have expected an instance of Array.
> The error occurred while evaluating nil.map

Certo, perché 

   @lands = Land.all :order => :denominazione

l'hai messo nel metodo index, ma non nel metodo new, dove dovrebbe
essere, per cui nel form @lands non è definita e quindi è nil.

Sposta quella riga nel metodo new.


pietro
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 13:01
Ok!!
Adesso lo visualizza!! Grazie!
Peccato che mi dia un altro errore nel momento che provo a 
salvarlo....ossia
"unknown attribute: amministration"

si riferisce all'amministration qui
<% f.fields_for :amministration do |builder| %>
o qualcos'altro nel controller?

Posted by Pietro Giorgianni (giorgian)
on 2010-03-02 13:24
(Received via mailing list)
Il 02 marzo 2010 13.01, Paola Andriani <nuvola@elbalink.it> ha scritto:
> Ok!!
> Adesso lo visualizza!! Grazie!
> Peccato che mi dia un altro errore nel momento che provo a
> salvarlo....ossia
> "unknown attribute: amministration"
>
> <% f.fields_for :amministration do |builder| %>

prova :amministrations


pietro
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 13:32
Pietro Giorgianni wrote:
> Il 02 marzo 2010 13.01, Paola Andriani <nuvola@elbalink.it> ha scritto:
>> Ok!!
>> Adesso lo visualizza!! Grazie!
>> Peccato che mi dia un altro errore nel momento che provo a
>> salvarlo....ossia
>> "unknown attribute: amministration"
>>
>> <% f.fields_for :amministration do |builder| %>
> 
> prova :amministrations
> 
> 
> pietro

ehm se metto :amministrations visualizza solo la prima parte del form, 
la seconda non la fa vedere!
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 15:42
> ehm se metto :amministrations visualizza solo la prima parte del form, 
> la seconda non la fa vedere!

non mi da nessun tipo di errore, semplicemente non mi visualizza la 
parte del forum da fields_for in poi. Poi visualizza regolarmente il 
tasto Submit e se salvo la persona la salva.
Ho ricontrollato la documentazione ma non capisco cosa non vada (come al 
solito).
Poi ancora non ho capito se devo passargli l'id della persona da 
associare nella tabella Amministrations oppure no.
Posted by Marco Mastrodonato (marcomd)
on 2010-03-02 16:20
E' normale che non vedi niente, dovresti fare qualcosa del genere:

#app\controllers\people_controller.rb
def new
  @person = Person.new
  @person.amministrations.build


sistema anche la edit
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 17:55
Marco Mastrodonato wrote:
> E' normale che non vedi niente, dovresti fare qualcosa del genere:
> 
> #app\controllers\people_controller.rb
> def new
>   @person = Person.new
>   @person.amministrations.build
> 
> 
> sistema anche la edit

Grazie mille!!
Ha funzionato perfettamente, inoltre mi passa direttamente anche l'id 
della persona quindi è perfetto!
Se puoi e hai voglia mi spieghi cos'è .build?
Grazie ancora!!
Posted by Pietro Giorgianni (giorgian)
on 2010-03-02 19:37
(Received via mailing list)
Il 02 marzo 2010 17.55, Paola Andriani <nuvola@elbalink.it> ha scritto:
> cos'è .build?

Quando hai un'associazione has_many, il metodo build, applicato alla
collection associata, inizializza un nuovo oggetto, senza però 
salvarlo sul db.

In pratica, se all'inizio @person.amministrations vale [], cioè array
vuoto, ed esegui @person.amministrations.build, ora
@person.amministrations contiene un elemento, con tutti i campi nil,
tranne person_id, che avrà lo stesso valore di @person.id.

Questo e molto altro è disponibile qui:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html


p. s. ma il nome giusto non sarebbe administration, con la d?



pietro
Posted by Paola Andriani (corto_maltese)
on 2010-03-02 19:49
> 
> p. s. ma il nome giusto non sarebbe administration, con la d?
> 
> 
> 
> pietro

Grazie!! Si assolutamente, ma ho rifatto la parte di fretta e ho 
sbagliato a scrivere, infatti stasera lo rifaccio a modino! ^_^
:D
Posted by Marco Mastrodonato (marcomd)
on 2010-03-03 09:21
Paola, se posso darti un consiglio, fai le cose con calma. Per esempio i 
modelli multipli: sarebbe stato meglio se li avessi prima provati in un 
progetto di prova (per seguire meglio la guida o il tutorial) e solo 
quando hai capito tutto li inizi ad usare. Avrai meno difficoltà e 
risparmi tempo.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.