View personalizzate

Salve a tutti,
e’ da qualche tempo che gioco con ror, ma senza essermi mai spinto oltre
i fondamenti base.
Mi trovo davanti a un problema che non so come approcciare, vi spiego:
io ho un modello A che ha intorno diversi altri modelli legati a lui, B,
C, D i quali possiedono tutti la chiave di A (a_id).
Nella new di A io vorrei visualizzare (oltre alla new di A stesso) le
new di B, C e D e in fase di “save” poter fare lo store dei campi
inseriti per A ma anche dei dati per B, C, e D comprensivi della chiave
primaria (id) di A appena create (e’ settata come autoincrement).

Spero di essere stato abbastanza chiaro, nel caso saro’ lieto di
esplicare il mio problema magari con uno schema.

Attendo aiuti e consigli.

Saluti

Forse non ti capito bene… ma diciamo che hai una situazione del
genere: un blog (con estrema fantasia!).

class Post < ActiveRecord::Base
has_many :comments
end

class Comment < ActiveRecord::Base
belongs_to :post
end

Allora (provalo in una console) puoi fare:

p = Post.new
p.title = ‘A title’
p.body = ‘Some bla bla…’
p.comments << Comment.new(:content => ‘nice post!’)
p.save

Il nuovo commento viene “automaticamente” associato a p. Quando salvi
p salvi anche tutti gli oggetti “dipendenti”… (ripeto: provalo in
una console).

Il 01/04/08, Matteo Buferli[email protected] ha scritto:

On Apr 1, 2008, at 1:08 PM, Matteo Buferli wrote:

inseriti per A ma anche dei dati per B, C, e D comprensivi della
chiave
primaria (id) di A appena create (e’ settata come autoincrement).

Spero di essere stato abbastanza chiaro, nel caso saro’ lieto di
esplicare il mio problema magari con uno schema.

Facciamo un esempio semplice (ai limiti dello stupido…): un form per
creare un contatto (Contact) e un
indirizzo collegato (Address)
Contact ha 2 campi (first_name e last_name) e una relazione
(has_many :addresses) verso Address.
Address ha 2 campi (street_address e city) e una relazione
(belongs_to :contact) verso Contact

Il controller:
class ContactsController
def new
@contact = Contact.new
@address = Address.new
end

def create
@contact = Contact.new(params[:contact])
if @contact.save
@address = @contact.addresses.build(params[:address])
if @address.save
redirect_to contact_url(@contact) and return
end
end
render :action => “new”
end
end

il template:

<% form_for @contact do |f| %>
<%= error_messages_for(“contact”) %>

First name: <%= f.text_field(:first_name)

Last name: <%= f.text_field(:last_name)

<% fields_for @address do |af| %> <%= error_messages_for("address") %>

Address: <%= af.text_field(:street_address) %>

City: <%= af.text_field(:city) %>

<%= submit_tag "Create" %> <% end %>

Spero sia abbastanza chiaro (e di non aver fatto errori :slight_smile:

S.

PS
per correttezza il codice di #create dovrebbe gestire il caso in cui
@contact e’ valido ma @address no (per esempio con una transazione)

Stefano C. wrote:

Il controller:
class ContactsController
def new
@contact = Contact.new
@address = Address.new
end

def create
@contact = Contact.new(params[:contact])
if @contact.save
@address = @contact.addresses.build(params[:address])
if @address.save
redirect_to contact_url(@contact) and return
end
end
render :action => “new”
end
end

Grazie mille, ora provo… per complettezza volevo chiederti il
significato di questo blocco che non mi e’ molto chiaro

  @contact = Contact.new(params[:contact])
  if @contact.save
    @address = @contact.addresses.build(params[:address])
    if @address.save
      redirect_to contact_url(@contact) and return
    end
  end

On Apr 1, 2008, at 4:36 PM, Matteo Buferli wrote:

 end
  1. inizializza @contact con i parametri contenuti nella chiave :contact

  2. prova a salvare @contact

  3. inizializza un Address usando la relazione @contact.addresses (per
    impostare la foreign key automaticamente)

  4. prova a salvare @address

  5. redirigi e ritorna dal metodo

  6. se @contact.save o @address.save falliscono, renderizza di nuovo il
    form… solo che mi sono dimenticato la riga:

    render(:action => “new”)

Chiaramente se @contact e’ valido ma @address no, bisognerebbe fare il
rollback (con una transazione o cancellando manualmente @contact)

S.

Scusate, ho risposto qui…

http://www.ruby-forum.com/topic/148190#new