[ruby-it] Models multipli in un form

Paola Andriani nuvola a elbalink.it
Mar 2 Mar 2010 12:16:46 CET


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 via http://www.ruby-forum.com/.


More information about the Ml mailing list