Forum: Italian Ruby user group Problema con le relation

1e2797cc6ee6a961dbe7b54db1cf2f83?d=identicon&s=25 Mauro M. (mauro_m)
on 2012-05-07 11:34
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:

<ul>
  <% @event.links.each do |link| %>
    <li><%= link.url %></li>
  <% end %>
</ul>

Solo che non funziona :( Cosa sto sbagliando?
32d80da41830a6e6c1bb3eb977537e3e?d=identicon&s=25 Alessandro R. (alessandro_r)
on 2012-05-07 11:45
(Received via mailing list)
event_id dev essere di tipo integer, non string

2012/5/7 Mauro M. <gagginaspinnata@gmail.com>
1e2797cc6ee6a961dbe7b54db1cf2f83?d=identicon&s=25 Mauro M. (mauro_m)
on 2012-05-07 12:21
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 :(
32d80da41830a6e6c1bb3eb977537e3e?d=identicon&s=25 Alessandro R. (alessandro_r)
on 2012-05-07 12:25
(Received via mailing list)
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
1e2797cc6ee6a961dbe7b54db1cf2f83?d=identicon&s=25 Mauro M. (mauro_m)
on 2012-05-07 12:43
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:
<ul>
  <% @event.links.each do |link| %>
    <li><%= link.url %></li>
  <% end %>
</ul>

?

E' la stessa cosa se faccio cosi:

<ul>
  <%  for link in @event.links %>
    <li><%= link.url %></li>
  <% end %>
</ul>

Oppure forse ho sbagliato qualcosa nel file routes?

Peps::Application.routes.draw do

 resources :events do
  resources :links
 end

  resources :links

  resources :events

end
1e2797cc6ee6a961dbe7b54db1cf2f83?d=identicon&s=25 Mauro M. (mauro_m)
on 2012-05-07 12:59
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
 => []
32d80da41830a6e6c1bb3eb977537e3e?d=identicon&s=25 Alessandro R. (alessandro_r)
on 2012-05-07 14:22
(Received via mailing list)
ma che tipo di errore hai? Perch a prima vista sembra tutto ok. Riesci a
fornire qualche dettaglio in pi dal log?
1e2797cc6ee6a961dbe7b54db1cf2f83?d=identicon&s=25 Mauro M. (mauro_m)
on 2012-05-07 14:30
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
<ul>
  <% @event.links.each do |link| %>
    <li><%= link.url %></li>
  <% end %>
</ul>

Stampa nella pagina html solo <ul></ul>

Non vengono stampati i link..
32d80da41830a6e6c1bb3eb977537e3e?d=identicon&s=25 Alessandro R. (alessandro_r)
on 2012-05-07 14:51
(Received via mailing list)
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. <gagginaspinnata@gmail.com>
1e2797cc6ee6a961dbe7b54db1cf2f83?d=identicon&s=25 Mauro M. (mauro_m)
on 2012-05-07 15:00
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. <gagginaspinnata@gmail.com>

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à
32d80da41830a6e6c1bb3eb977537e3e?d=identicon&s=25 Alessandro R. (alessandro_r)
on 2012-05-07 15:43
(Received via mailing list)
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?
1e2797cc6ee6a961dbe7b54db1cf2f83?d=identicon&s=25 Mauro M. (mauro_m)
on 2012-05-07 17:22
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 >
Fb4482bd900141ed8bd3f3fcc3723f90?d=identicon&s=25 Luca Mearelli (Guest)
on 2012-05-07 17:30
(Received via mailing list)
2012/5/7 Mauro M. <gagginaspinnata@gmail.com>

> 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
32d80da41830a6e6c1bb3eb977537e3e?d=identicon&s=25 Alessandro R. (alessandro_r)
on 2012-05-07 18:02
(Received via mailing list)
Esatto!  L'ultimo comando ti dice chiarimente che non hai impostato
event id
Il giorno 07/mag/2012 17.29, "Luca Mearelli"
<l.mearelli@spazidigitali.com>
ha scritto:
1e2797cc6ee6a961dbe7b54db1cf2f83?d=identicon&s=25 Mauro M. (mauro_m)
on 2012-05-07 22:54
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| %>

  <p><%= f.text_field :url %></p>
  <p><%= f.submit "Aggiungi link" %></p>
<% end %>

Non dovrebbe passarlo automaticamente l'id dell'evento?
32d80da41830a6e6c1bb3eb977537e3e?d=identicon&s=25 Alessandro R. (alessandro_r)
on 2012-05-08 10:36
(Received via mailing list)
dipende da cosa c' scritto nel controller

2012/5/7 Mauro M. <gagginaspinnata@gmail.com>
1e2797cc6ee6a961dbe7b54db1cf2f83?d=identicon&s=25 Mauro M. (mauro_m)
on 2012-05-08 11:09
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 :(
32d80da41830a6e6c1bb3eb977537e3e?d=identicon&s=25 Alessandro R. (alessandro_r)
on 2012-05-08 11:12
(Received via mailing list)
si, infatti dovrebbe farlo in automatico senza bisogno di quella
chiamata.
6dbddfda34303f8d83620f7293612671?d=identicon&s=25 Tommaso Visconti (Guest)
on 2012-05-08 11:15
(Received via mailing list)
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
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.