Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Relazioni fra modelli

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    13

    Relazioni fra modelli

    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!

  2. #2
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    Se ho capito quello che stai chiedendo e se
    codice:
    @bookmark.page = @page
    allora l'attributo content della pagina lo ottieni così
    codice:
    @bookmark.page.content

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    13
    E' la prima cosa che ho provato, ma purtroppo restituisce un errore "nil object"... mi manca qualche collegamento, qualche riferimento da qualche parte?

  4. #4
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    E allora devi postare il codice che hai scritto e l'errore preciso, altrimenti non si capisce un tubo.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    13
    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 age, :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

  6. #6
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    Originariamente inviato da alan77
    codice:
    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 altrimenti si rischia di non capirci niente.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    13
    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!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.