New personalizzate, come fare?

Salve a tutti,
penso di perdere tempo su un problema molto banale: ho una vista che
crea un form per un oggetto A e un oggetto B a lui collegato.
Nel controller dell’oggetto A ho scritto le seguenti righe di codice:

@obja = A.new(params[:a])
@objb = B.new(params[:b])

Ora io vorrei pero’ che un in objb venga impostato automaticamente il
campo a_id con la chiave di A appena creata. Come posso fare? Io avevo
pensato di modificare B successivamente con

@objb.a_id = @obja.id

ovviamente non funziona.
Mi chiedo 2 cose:

  1. esiste un modo per passare alla new non tutti i parametri da
    acquisire nella view, ma solo alcuni e prederminarne altri?
  2. perche’ l’assegnamento cosi scritto non funziona?

Saluti e grazie.

Se non ho capito male, c’è una relazione uno a uno tra B ed A, in cui B
appartiene ad A.
Ti faccio una domanda stupida, dopo l’assegnazione, salvi @objb?
Il modo corretto per ottenere quello che ti interessa consinste nel
salvare prima @a, instanziare @b e poi assegnare:

@b.a = @a
@b.save

Quando salvi @b la relazione verrà persistita.

Tornando alla prima domanda, params è un hash che contiene tutti i
parametri inviati tramite la request. Pertanto puoi accedere agli
elementi che ti interessa passare al costruttore del tuo oggetto.
Es: @a = A.new(:name => params[:a][:name])
In questo caso passi al costruttore di A, solo l’attributo name inviato
dal client, ignorando tutto il resto.

Non ho capito la seconda parte della domanda, quella in cui parli di
“predeterminarne altri”.

Spero d’essere stato chiaro.

Luca

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Luca G. wrote:

Ok

Tornando alla prima domanda, params è un hash che contiene tutti i
parametri inviati tramite la request. Pertanto puoi accedere agli
elementi che ti interessa passare al costruttore del tuo oggetto.
Es: @a = A.new(:name => params[:a][:name])
In questo caso passi al costruttore di A, solo l’attributo name inviato
dal client, ignorando tutto il resto.

Non ho capito la seconda parte della domanda, quella in cui parli di
“predeterminarne altri”.

Nel controller scrivo
@a = A.new(params[:a])

in tal modo passo tutti i campi dell’oggetto a al form, ma se io sapessi
a priori che il campo pippo di a fosse uguale a x, come potrei fare in
modo che la new tenga conto di cio’?
Ovvero vorrei passare tutti i valori di A tranne che il campo pippo.

Per fare cio’ devo per forza intervenire dopo sull’oggetto ovvero:
@a = A.new(params[:a])
[compilazione campi nella view, submit]
@a.save
@a.pippo = “x”

Si puo’ fare piu’ velocmente?

Spero d’essere stato chiaro.

Luca


Matteo Buferli
WEB: http://www.buferli.com
PGP FINGERPRINT: B7C9 BE0A F77F 4747 56A2 87EC F6E5 8A01 65BB 58C1
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFH/NJI9uWKAWW7WMERAmefAJ91GN8qOiLbp/xjwcm8u6mb+Ks/PwCeLNvD
VOVnL202922ihBODlRKF9oI=
=QqJn
-----END PGP SIGNATURE-----