PDA

Visualizza la versione completa : Relazioni fra modelli


alan77
19-02-2009, 12:03
Ciao, sono un newbie che si sta cimentando coi primi progetti con RoR2, ed ho questo problema: non mi è chiaro come utilizzare i riferimenti tra due modelli (ovvero, due tabelle del db) una volta che sono collegati tramite relazioni come :has_many, :belongs_to etc.

Mi riferisco ad esempio (ma mi è capitato anche altrove) all'applicazione della guida RoR2 di questo sito, il bookmark manager: al capitolo 23 si definisce il modello "page" con attributo "content" che va messo in relazione col modello "bookmark" già esistente:
dopo aver creato il modello con "scaffold", fatta la migration, inserite le relazioni (has_one da una parte, belongs_to dall'altra), e popolato il nuovo modello, ho inserito nel controller dei bookmark l'istruzione "@bookmark.page = @page" all'interno del metodo "show".

Fatto questo, vorrei mostrare l'attributo "content" della pagina collegata a tale bookmark, inserendo un tag ruby nel show.html.erb dei bookmark.

Supponendo che la relazione fra i due modelli sia stata effettuata automaticamente mediante la chiave "id", come richiamo il dato "content" della page?

Spero di essere stato abbastanza chiaro, ho l'impressione di essermi perso in un bicchier d'acqua.

Grazie, ciao!

toraz
19-02-2009, 12:22
Se ho capito quello che stai chiedendo e se


@bookmark.page = @page

allora l'attributo content della pagina lo ottieni così


@bookmark.page.content

alan77
19-02-2009, 12:43
E' la prima cosa che ho provato, ma purtroppo restituisce un errore "nil object"... mi manca qualche collegamento, qualche riferimento da qualche parte?

toraz
19-02-2009, 13:28
E allora devi postare il codice che hai scritto e l'errore preciso, altrimenti non si capisce un tubo.

alan77
19-02-2009, 16:43
Dunque, nella classe BookmarksController il metodo "show" è il seguente:

def show
@bookmark = Bookmark.find(params[:id])
@bookmark.page = @page
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @bookmark }
end
end

e nella relativa vista "show.html.erb" ho inserito il seguente riferimento:

Content:
<%=h @bookmark.page.content %>

Dentro i due modelli ("bookmark" e "page") ho inserito le seguenti relazioni:

class Bookmark < ActiveRecord::Base
has_one :page, :select => :content
(etc.)

class Page < ActiveRecord::Base
belongs_to :bookmarks
end

L'errore, quando faccio richiamare il metodo "show", è il seguente:

NoMethodError in Bookmarks#show

Showing app/views/bookmarks/show.html.erb where line #18 raised:

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.content

toraz
19-02-2009, 17:58
Originariamente inviato da alan77


def show
@bookmark = Bookmark.find(params[:id])
@bookmark.page = @page
# ...
end


Non hai inizializzato @page.
Però mi viene da chiedermi una cosa, se stai tirando fuori il bookmark dal database verosimilmente avrà già una page associata, perché gliene vorresti associare un'altra?

Ti capitasse di postare di nuovo del codice usa i tag code (http://forum.html.it/forum/misc.php?s=&action=bbcode) altrimenti si rischia di non capirci niente.

alan77
20-02-2009, 12:05
Fantastico, il problema era tutto lì. Mi pareva che dovesse essere banale! E d'altro canto riferirsi ad un altro modello non comporta l'attivazione del suo controller... pian piano ci entro...

L'applicazione in questione è contenuta in una guida, quindi ha lo scopo di esemplificare varie situazioni piuttosto che fornire soluzioni ottimizzate. Nella fattispecie, serviva solo per mostrare la gestione delle relazioni.

Grazie mille per l'aiuto! Ciao!

Loading