Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Al .NEXT 2026 di Chicago, Nutanix ha mostrato quanto sia cambiata: una piattaforma software che gestisce VM, container e carichi di lavoro IA ovunque, dall’on-premise al cloud pubblico. Con un’esecuzione rapidissima sulle partnership e sulla migrazione da VMware
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-02-2009, 19:53   #1
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
[Ruby On Rails] Prendere dati da un database e visualizzarli in una vista

Ciao a tutti!
Ho un problema con il classico esempio Depot del libro Agile Web Development with Rails, per chi non lo conoscesse nel database c'è una tabella prodotti, io ho voluto aggiungere una tabella categorie proprio per distinguerli.

Nel codice del modello del prodotto product.rb ho aggiunto il collegamento alle categorie
Codice:
class Product < ActiveRecord::Base
  [...]
  belongs_to :categories
in quello delle categorie category.rb ho fatto altrettanto.
Codice:
class Category < ActiveRecord::Base
  has_many :products
end
Ora vorrei recuperare la categoria a cui appartiene il libro così, sempre nel modello del prodotto product.rb, ho definito
Codice:
 def find_category
    @category = Product.find(:all,
      :joins => "as p inner join categories as c on p.category_id = c.id",
      :select => "c.category")
end
e modificata di conseguenza la vista con la chiamata alla funzione appena definita per visualizzare la categoria accanto il titolo del libro
Codice:
<h1><%= I18n.t 'main.title' %></h1>
<% for product in @products -%>
    <div class="entry">
        <%= image_tag(product.image_url) %>
        <h3><%=h product.title %> / <%=h product.find_category%></h3>
        <%= product.description %>
        <span class="price"><%= number_to_currency(product.price) %></span>
          <% form_remote_tag :url => { :action => :add_to_cart, :id => product } do %>
            <%= submit_tag I18n.t('main.button.add') %>
          <% end %>
    </div>
<% end %>
Purtroppo il risultato non è quello che mi aspettavo, così come potete vedere dalla seguente immagine.


A quanto pare mi viene restituito un array (?), o comunque tre elementi, che corrispondono al numero di libri appartenenti a quella categoria; in effetti eseguendo la query dal prompt SQL ottengo una tabella con tre elementi

http://www.pctunerup.com/up/results/...erCapture2.jpg

Tra l'altro vorrei anche creare un menù sulla sinistra con le categorie che linkano ai rispettivi libri, ma se non riesco a risolvere questo problema non saprei come fare.
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 20:24   #2
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
Ciao,
con l'associazione uno a molti col belogs_to devi mettere il singolare
Codice:
class Product < ActiveRecord::Base
  [...]
  belongs_to :category
poi se ha una istanza di Product e vuoi sapere la sua categoria basta che fai così:
Codice:
@product.category
senza fare altre query.
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 21:00   #3
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
Ciao e grazie per la risposta!
Ho modificato l'associazione e cambiato anche la vista cambiando il tag
Codice:
<%=h product.category%>
facendo così visualizza qualcosa di questo tipo #<Category:0x479b978>, è un problema di casting?
Nel dubbio ho anche commentato la funzione che avevo definito nel modello del prodotto.
Il log sembra ok
Codice:
Processing StoreController#index (for 127.0.0.1 at 2009-02-02 22:01:29) [GET]
  Session ID: 15c18f2c19c685bbb3987578c62a64a6
   [4;35;1mProduct Load (0.0ms) [0m    [0mSELECT * FROM `products` ORDER BY title [0m
Rendering template within layouts/store
Rendering store/index
   [4;36;1mProduct Columns (0.0ms) [0m    [0;1mSHOW FIELDS FROM `products` [0m
   [4;35;1mCategory Columns (0.0ms) [0m    [0mSHOW FIELDS FROM `categories` [0m
   [4;36;1mCategory Load (0.0ms) [0m    [0;1mSELECT * FROM `categories` WHERE (`categories`.`id` = 1)  [0m
   [4;35;1mCACHE (0.0ms) [0m    [0mSELECT * FROM `categories` WHERE (`categories`.`id` = 1)  [0m
   [4;36;1mCACHE (0.0ms) [0m    [0;1mSELECT * FROM `categories` WHERE (`categories`.`id` = 1)  [0m
Rendered store/_cart (0.0ms)
Completed in 47ms (View: 47, DB: 0) | 200 OK [http://localhost/store]

Ultima modifica di Xfree : 02-02-2009 alle 21:13.
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 21:16   #4
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
@product.category restituisce un oggetto di tipo categoria. #<Category:0x479b978> è la rappresentazione predefinita di un oggetto che indica il nome della classe e un l'id dell'oggeto (non quello di ActiveRecord).
Quello che tu vuoi fare è accedere ad un attributo di un getto categoria, facciamo per esempio che sia description, allora devi fare così:
Codice:
@product.category.description
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 21:40   #5
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
Perfetto, funziona, grazie mille!!
Ora sto vedendo come creare dinamicamente un menù con la lista delle categorie linkate ai rispettivi libri.
Avevo pensato di usare un ciclo così composto da inserire nel layout store all'interno di un div
Codice:
<% for category in @categories -%>
<li>category.category</li>
<%end%>
(so che il nome dell'attributo è infelice ) Il problema per me è come creare un link alla rispettive pagine..
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 21:45   #6
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
Così come avevo pensato di fare il ciclo non funziona
Codice:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 21:57   #7
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
Nel controller devi inizializzare la variabile @categories
Codice:
@categories = Category.all
poi per il menu puoi fare così
Codice:
<% for category in @categories -%>
<li><%= link_to(h(category.category), category_path(category)) %></li>
<%end%>
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 21:58   #8
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
che edizione hai del libro "Agile Web Development with Rails"?
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 22:04   #9
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
Ho la terza edizione attualmente in versione B1.10. Nel frattempo, controllando i sorgenti, confrontandolo con quello degli altri modelli avevo capito che il problema dipendeva dalla mancata inizializzazione della variabile perché, guardando il codice della classe, era vuoto.
Purtroppo continua a non funzionare, è come se non inizializzasse l'oggetto.
Il modello category.rb è:
Codice:
class Category < ActiveRecord::Base
  has_many :products
  @categories = Category.all
end
ma ho provato anche con
Codice:
class Category < ActiveRecord::Base
  has_many :products
  def initialize
    @categories = Category.all
  end
  
end
che dovrebbe essere corretto.

Ultima modifica di Xfree : 02-02-2009 alle 22:10.
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 22:13   #10
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
Non devi inizializzarla nel model devi inizializzarla nel controller. Più precisamente nella action corrispondente alla vista dove fai il ciclo.
Comunque ti consiglio di seguire con calma passo passo il libro che hai comprato che è ottimo.
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 22:19   #11
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
Guarda, il controller è stato creato automaticamente ed il codice è il seguente
Codice:
class CategoriesController < ApplicationController
  # GET /categories
  # GET /categories.xml
  def index
    @categories = Category.find(:all)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @categories }
    end
  end

  # GET /categories/1
  # GET /categories/1.xml
  def show
    @category = Category.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @category }
    end
  end

  # GET /categories/new
  # GET /categories/new.xml
  def new
    @category = Category.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @category }
    end
  end

  # GET /categories/1/edit
  def edit
    @category = Category.find(params[:id])
  end

  # POST /categories
  # POST /categories.xml
  def create
    @category = Category.new(params[:category])

    respond_to do |format|
      if @category.save
        flash[:notice] = 'Category was successfully created.'
        format.html { redirect_to(@category) }
        format.xml  { render :xml => @category, :status => :created, :location => @category }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @category.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /categories/1
  # PUT /categories/1.xml
  def update
    @category = Category.find(params[:id])

    respond_to do |format|
      if @category.update_attributes(params[:category])
        flash[:notice] = 'Category was successfully updated.'
        format.html { redirect_to(@category) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @category.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /categories/1
  # DELETE /categories/1.xml
  def destroy
    @category = Category.find(params[:id])
    @category.destroy

    respond_to do |format|
      format.html { redirect_to(categories_url) }
      format.xml  { head :ok }
    end
  end
end
L'inizializzazione a cui ti riferisci è quella del 5° rigo?
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 22:22   #12
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
si
ma tu questo codice dove lo hai messo?
Codice:
<% for category in @categories -%>
<li>category.category</li>
<%end%>
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 22:33   #13
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
La vista app/view/categories/index.html.erb ,generata automaticamente con il seguente codice,
Codice:
<h1>Listing categories</h1>

<table>
  <tr>
    <th>Category</th>
  </tr>

<% for category in @categories %>
  <tr>
    <td><%=h category.category %></td>
    <td><%= link_to 'Show', category %></td>
    <td><%= link_to 'Edit', edit_category_path(category) %></td>
    <td><%= link_to 'Destroy', category, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New category', new_category_path %>
funziona alla perfezione.
L'applicazione funziona con l'indirizzo http://localhost:3000/store, la visualizzazione della categoria accanto al titolo del libro l'ho messa nella vista
app/view/store/index.html.erb e funziona anche questa.

Codice:
<!-- START_HIGHLIGHT -->
<h1><%= I18n.t 'main.title' %></h1>
<!-- END_HIGHLIGHT -->

<% for product in @products -%>
    <div class="entry">
        <%= image_tag(product.image_url) %>
        <h3><%=h product.title %> / <%=h product.category.category%></h3>
        <%= product.description %>
        <span class="price"><%= number_to_currency(product.price) %></span>
        <!-- START:form_remote_tag -->
        <% form_remote_tag :url => { :action => :add_to_cart, :id => product } do %>
<!-- START_HIGHLIGHT -->
          <%= submit_tag I18n.t('main.button.add') %>
<!-- END_HIGHLIGHT -->
        <% end %>
        <!-- END:form_remote_tag -->
    </div>
<% end %>
La costruzione del menù, così come volevo farla io nell'homepage, l'ho messa nel layout app/view/layouts/store.html.erb all'interno del div con classe sidebar.
Codice:
[...]
<div id="page">
<div class="bgtop">
	<!-- start content -->
	<div id="content">
		<!-- START:flash -->
        <% if flash[:notice] -%>
          <div id="notice"><%= flash[:notice] %></div>
        <% end -%>
        <!-- END:flash -->
        <div id="store">
        <%= yield :layout %>
        </div>
	</div>
	<!-- end content -->
	<!-- start sidebar -->
	<div id="sidebar">
 
		 <!-- START:hidden_div -->
[...]
Evidentemente non ho capito qualcosa a proposito del funzionamento e mi sfugge qualcosa a proposito della visibilità degli oggetti.

Ultima modifica di Xfree : 02-02-2009 alle 22:38.
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 22:42   #14
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
se l'hai messa nel layout allora deve essere disponibile a tutte le viste che usano quel layout (probabilmente tutte) per cui devi inizializzarla in tutte le action. Puoi usare anche i filtri ma sono un argomento più avanzato.

Se hai bisogno di altro mi ritrovi damani ora vado a letto.
Ciao
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 22:44   #15
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
Quote:
Evidentemente non ho capito qualcosa a proposito del funzionamento e mi sfugge qualcosa a proposito della visibilità degli oggetti.
Guarda all'inizio ci vuole un pò per capire il meccanismo, ma come ti ho detto prima se segui il tutorial passo per passo poi ti studi i capitoli di approfondimento sui vari argomenti vedrai che non è così difficile anzi...
Ciao
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 22:46   #16
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
Quindi dovrei inizializzare

Codice:
 @categories = Category.find(:all)
in tutte le action del controller categories, se ho capito bene.
Io continuo un altro pò, poi vado a letto anche io.
Grazie per le risposte e per il tempo dedicatomi.
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2009, 23:05   #17
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
Le migliori illuminazioni vengono quando ormai si perdono le speranze
Ho pensato un attimo e mi sono detto che se era lo store l'oggetto visualizzato, allora dovevo inizializzare la variabile nell'index del controller dello store, così ho fatto ed ha funzionato, come puoi vedere dall'immagine.


Cliccando sul link ottengo il seguente errore che vedrò di sistemare domani, anche perché ormai il sonno avanza inesorabile!


Eh sì, ora o funziona il frontend o funziona il backend, per accedere al backend devo rimuovere
Codice:
<% for category in @categories -%>
<li><%= link_to(h(category.category), category_path(category)) %></li>
<%end%>
dal layout app/views/layouts/store.html.erb

Ultima modifica di Xfree : 02-02-2009 alle 23:18.
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 10-09-2010, 14:29   #18
Andrea2084
Junior Member
 
Iscritto dal: Sep 2010
Messaggi: 2
Salve,
mi rendo conto che il thread risale a più di un anno fa. Anche io ho seguito passo passo il libro "Agile web development with rails" e come te mi piacerebbe creare un menù con la lista delle categorie linkate ai rispettivi libri.
Cioè vorrei che, una volta che clicco il link di una categoria, la vista index di store mi visualizzasse i prodotti appartenenti a quella categoria. Ho seguito i suggerimenti di questo thread però poi non sono riuscito a implementare ciò che ho appena descritto. Tu come hai fatto?

Premetto che sono alle prime armi con ruby on rails, io mi sono creato il menù delle categorie così come ho letto qui, piazzandolo nel layout "store.html.erb"
Codice:
  <% for category in @categories -%>
		<li><%= link_to(h(category.description), :controller => :store, :action => :index, :id => category) %></li>
  <%end%>
All'interno del link_to ho specificato ":action => :index" e ":id => category" perchè vorrei che, quando clicco su di una categoria di prodotti, mi si visualizzi la vista index di store ossia l'elenco dei prodotti corrispondenti a quella categoria.
Allora nello store_controller ho pensato di fare così:
Codice:
   def index
     
     @categories = Category.find(params[:id])
     @products = Product.find(:all, :order => "articolo", :conditions => ['category_id = ?', @categories.id])
     @cart = find_cart
     
  end
In una variabile di istanza acquisisco l'oggetto category e poi faccio estrarre dalla tabella prodotti, soltanto i prodotti per i quali è verificata l'uguaglianza tra la chiave esterna ("category_id") e la chiave primaria della categoria (@categories.id).
Purtroppo al momento di eseguire l'applicazione mi dà errore nel layout "store.html.erb", precisamente nel ciclo "for" del seguente blocco di codice:
Codice:
  <% for category in @categories -%>
		<li><%= link_to(h(category.description), :controller => :store, :action => :index, :id => category) %></li>
  <%end%>
L'errore visualizzato è: undefined method `each' for #<Category:0x6234438>

Spero che tu mi possa aiutare.
Andrea2084 è offline   Rispondi citando il messaggio o parte di esso
Old 10-09-2010, 17:00   #19
Xfree
Senior Member
 
L'Avatar di Xfree
 
Iscritto dal: Aug 2001
Messaggi: 9538
Ciao Andrea, mi spiace non poterti essere d'aiuto ma Ruby l'ho rimosso dalla mia mente pochi giorni dopo l'utimo messaggio di questo thread e non ne ricordo più il funzionamento perché poi non l'ho più usato. Tra l'altro non posso nemmeno passarti i file del progetto : ai tempi non l'ho potuto completare perché si ruppe l'hard disk sul quale lo tenevo e non avevo copie di backup (mea culpa ).
Xfree è offline   Rispondi citando il messaggio o parte di esso
Old 10-09-2010, 20:48   #20
Andrea2084
Junior Member
 
Iscritto dal: Sep 2010
Messaggi: 2
Quote:
Originariamente inviato da Xfree Guarda i messaggi
Ciao Andrea, mi spiace non poterti essere d'aiuto ma Ruby l'ho rimosso dalla mia mente pochi giorni dopo l'utimo messaggio di questo thread e non ne ricordo più il funzionamento perché poi non l'ho più usato. Tra l'altro non posso nemmeno passarti i file del progetto : ai tempi non l'ho potuto completare perché si ruppe l'hard disk sul quale lo tenevo e non avevo copie di backup (mea culpa ).
Capisco..e vabbè ci ho provato. Vorrà dire che continuerò a spremermi le meningi oppure lascio perdere pure io e mi accontento di un semplice catalogo prodotti. Grazie lo stesso per la risposta.

Nessun'altro può darmi una mano?
Andrea2084 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
Ryzen 7 5800X3D pronto a tornare sul mer...
NASA: l'amministrazione Trump prosegue s...
L'Iran avrebbe acquistato un satellite p...
VivaTech compie dieci anni e raddoppia p...
Le vendite di CPU si sono ridotte di 25 ...
Starship: SpaceX ha completato lo static...
Huawei FusionSolar Roadshow 2026: l'inno...
Nuovo trailer per Street Fighter: un fil...
Sovranità sui dati: arriva la pri...
Schede video NVIDIA e AMD di nuovo su Ma...
Robot aspirapolvere, TV OLED, iPhone 17 ...
EUREKA J15 Pro Ultra super interessante ...
Intel porta l'AI nei notebook entry-leve...
6000 mAh, 5G e 108MP a meno di 200€: ecc...
FRITZ!Mesh Set 2700: Wi-Fi 7 in tutta la...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:51.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v