Salve ragazzi,
Ho 2 modelli (con relativi controller e viste) chiamati EVENTS e LINKS.
Ogni events has_many :links
Ogni links belongs_to :event
Questo è lo schema di questi due modelli:
create_table “events”, :force => true do |t|
t.string “title”
t.text “note”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.string “event_id”
end
create_table “links”, :force => true do |t|
t.string “url”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “event_id”
end
Nella pagina SHOW della vista EVENTS vorrei mostrare tutti i link
relativi a ogni event.
Nel file routes ho scritto
resources :events do
resources :links
end
E nella pagina show della vista events ho scritto:
<% @event.links.each do |link| %>
- <%= link.url %>
<% end %>
Solo che non funziona Cosa sto sbagliando?
event_id dev essere di tipo integer, non string
2012/5/7 Mauro M. [email protected]
Anzi tutto grazie per la risposta
Ho modificato lo schema ed ora è cosi:
create_table “events”, :force => true do |t|
t.string “title”
t.text “note”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “link_id”
end
create_table “links”, :force => true do |t|
t.string “url”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “event_id”
end
Ma continua a non funzionare
Sto avendo un sacco di problemi con le relation
Niente non va
Il mio schema è esattamente questo ora:
create_table “events”, :force => true do |t|
t.string “title”
t.text “note”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
end
create_table “links”, :force => true do |t|
t.string “url”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “event_id”
end
Non è che c’è qualche errore qua:
<% @event.links.each do |link| %>
- <%= link.url %>
<% end %>
?
E’ la stessa cosa se faccio cosi:
<% for link in @event.links %>
- <%= link.url %>
<% end %>
Oppure forse ho sbagliato qualcosa nel file routes?
Peps::Application.routes.draw do
resources :events do
resources :links
end
resources :links
resources :events
end
elimina la colonna link_id dalla tabella events.
create_table “events”, :force => true do |t|
t.string “title”
t.text “note”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
end
create_table “links”, :force => true do |t|
t.string “url”
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
t.integer “event_id”
end
ma che tipo di errore hai? Perch a prima vista sembra tutto ok. Riesci a
fornire qualche dettaglio in pi dal log?
Se può essere utile ho provato dalla console a fare cosi:
1.9.2p318 :014 > @event=Event.find(1)
Event Load (0.2ms) SELECT “events”.* FROM “events” WHERE
“events”.“id” = ? LIMIT 1 [[“id”, 1]]
=> #<Event id: 1, title: “Germinazione”, note: “Sono germinati i primi
habanero”, created_at: “2012-05-06 22:11:36”, updated_at: “2012-05-06
22:11:36”>
1.9.2p318 :015 > @event.links
Link Load (0.2ms) SELECT “links”.* FROM “links” WHERE
“links”.“event_id” = 1
=> []
la query che genera errata. nei model hai definito la relazione?
in Event devi definire
has_many :links, :class_name => ‘Link’
in Link devi definire
belongs_to :event, :class_name => ‘Event’, :foreign_key => :event_id
2012/5/7 Mauro M. [email protected]
Alessandro R. wrote in post #1059828:
ma che tipo di errore hai? Perch a prima vista sembra tutto ok. Riesci a
fornire qualche dettaglio in pi dal log?
Non ho nessun errore! Guarda il log:
Started GET “/links/1” for 127.0.0.1 at 2012-05-07 12:50:26 +0200
Processing by LinksController#show as HTML
Parameters: {“id”=>“1”}
[1m[36mLink Load (0.2ms)[0m [1mSELECT “links”.* FROM “links” WHERE
“links”.“id” = ? LIMIT 1[0m [[“id”, “1”]]
Rendered links/show.html.erb within layouts/application (1.7ms)
Completed 200 OK in 10ms (Views: 8.6ms | ActiveRecord: 0.2ms)
Il problema è che non mi mostra, nella vista show degli eventi, i link
relativi.
Il codice
<% @event.links.each do |link| %>
- <%= link.url %>
<% end %>
Stampa nella pagina html solo
Non vengono stampati i link…
Adesso la query che genera corretta. Sembra che non ci siano record
nella
tabella links
Se esegui gli stessi due comandi di prima da terminale?
Alessandro R. wrote in post #1059837:
la query che genera errata. nei model hai definito la relazione?
in Event devi definire
has_many :links, :class_name => ‘Link’
in Link devi definire
belongs_to :event, :class_name => ‘Event’, :foreign_key => :event_id
2012/5/7 Mauro M. [email protected]
Non avevo impostato la foreign_key nel modello…
Anche mettendola però non funziona, i link non vengono mostrati.
La query che esegue ora è questa:
Started GET “/events/1” for 127.0.0.1 at 2012-05-07 14:54:51 +0200
Processing by EventsController#show as HTML
Parameters: {“id”=>“1”}
Event Load (0.3ms) SELECT “events”.* FROM “events” WHERE
“events”.“id” = ? LIMIT 1 [[“id”, “1”]]
Link Load (0.1ms) SELECT “links”.* FROM “links” WHERE
“links”.“event_id” = 1
Rendered events/show.html.erb within layouts/application (54.5ms)
Completed 200 OK in 132ms (Views: 80.1ms | ActiveRecord: 5.6ms)
Puoi vedere il codice qua
https://bitbucket.org/gagginaspinnata/problema-relazioni/src
Grazie mille per la disponibilità
Alessandro R. wrote in post #1059853:
Adesso la query che genera corretta. Sembra che non ci siano record
nella
tabella links
Se esegui gli stessi due comandi di prima da terminale?
I links ci sono perchè se vado a vedere la pagina index della vista
links (che ho creato) vengono mostrati
Questo il risultato di quei comandi: 1.9.2p318 :001 >
@event=Event.find(1)
Event Load (4.2ms) SELECT “events”.* FROM “events” WHERE
“events”.“id” = ? LIMIT 1 [[“id”, 1]]
=> #<Event id: 1, title: “Germinazione”, note: “Sono germinati i primi
habanero”, created_at: “2012-05-06 22:11:36”, updated_at: “2012-05-06
22:11:36”>
1.9.2p318 :002 > @event.links
Link Load (0.1ms) SELECT “links”.* FROM “links” WHERE
“links”.“event_id” = 1
=> []
1.9.2p318 :003 >
Esatto! L’ultimo comando ti dice chiarimente che non hai impostato
event id
Il giorno 07/mag/2012 17.29, “Luca M.”
[email protected]
ha scritto:
2012/5/7 Mauro M. [email protected]
I links ci sono perch se vado a vedere la pagina index della vista
links (che ho creato) vengono mostrati
ma i links hanno il giusto event_id ? Ho l’impressione che tu li abbia
creati senza collegarli all’Event …
Luca
dipende da cosa c’ scritto nel controller
2012/5/7 Mauro M. [email protected]
Ok ho risolto cosi nel controller:
@link.event_id= params[:event_id]
A dir la verità pensavo che rails lo facesse in automatico
Grazie mille e scusa per le mille domande
si, infatti dovrebbe farlo in automatico senza bisogno di quella
chiamata.
Avete ragione inserendo un link tramite console e specificando l’id
relativo funziona.
Ma utilizzando il codice
<%= form_for([@event, @event.links.build]) do |f| %>
<%= f.text_field :url %>
<%= f.submit "Aggiungi link" %>
<% end %>
Non dovrebbe passarlo automaticamente l’id dell’evento?
Il 08/05/12 11:09, Mauro M. ha scritto:
Ok ho risolto cosi nel controller:
@link.event_id= params[:event_id]
A dir la verit pensavo che rails lo facesse in automatico
Grazie mille e scusa per le mille domande
Fossi in te non passerei direttamente l’id, altrimenti puoi metterci un
numero a caso (a meno di validazioni).
farei cos:
event = Event.find(params[:event_id])
@link.events << event if event