News_id di un commento

Ciao a tutti,
ancora una volta mi scontro contro il muro di un problema che, sebbene
sembri facile e comprensibile, in rails va affrontato in un modo che non
so -_-’
Allora, ho creato nifty_scaffoldando model e controller “comment”, nella
migrazione ho inserito t.references :neew (sarebbero le news, le ho
chiamate in questo modo barbaro perchè chiamandole “new” non mi
funzionava il metodo “new”…roba da matti), nel modello della neew ho
messo has_many :comments, in quello del commento ho messo belongs_to
:neew, e ho lanciato rake db:migrate
(ho fatto questo preambolo perchè magari qualcuno, spero, mi farà notare
che esistono modi un po’ più agili per fare le associazioni e le
relationship tra i modelli).
In pratica, ora che ho tutto disponibile, mi interessa che se sono nella
show di una news voglio scrivere un commento(e fin qui ci sono riuscito)
che abbia come neew_id(colonna della tabella comments) l’id della news
che sto commentando!
Codice della show.html.erb di neews:

<% for comment in @neew.comments %>
<%= link_to_unless comment.site_url.blank?, h(comment.author_name), h(comment.site_url) %> il <%= comment.created_at.strftime('%b %d, %Y alle %H:%M') %>
<%= comment.content %>

<%= link_to 'Destroy', comment, :method => :delete, :confirm => 'Sei sicuro?' %>

<% end %>
<% end %> <% form_for @comment do |f| %> <%= f.error_messages %>

<%= f.label :site_url %>
<%= f.text_field :site_url %>

<%= f.label :author_name %>
<%= f.text_field :author_name %>

<%= f.label :content %>
<%= f.text_area :content %>

<%= f.submit "Submit" %>

<% end %> .....

probabilmente devo fare in modo che nel campo neew_id venga scritto,
ogni volta che si lancia a create del commento, l’id della news che sto
commentando…e lo devo fare nel controller del commento immagino…ma
come??
Grazie mille ancora! :wink:

Il 20 novembre 2009 19.04, Giorgio A. [email protected] ha scritto:

 <p>
   <%= f.label :content %><br />
   <%= f.text_area :content %>
 </p>
 <p><%= f.submit "Submit" %></p>

<% end %>

ciao,
il modo più semplice è inizializzare @comment nel metodo show, scrivendo:

def show

@comment = @neew.comments.new
end

In questo modo @comment avrà già neew_id impostato al valore corretto;
poi basta aggiungere da qualche parte in questo form un

<%= f.hidden_field :neew_id %>

pietro

grazie x la risposta…
se intendi il metodo show delle news ho provato ma mi salva i commenti
con neew_id = NULL, proprio come prima…l’hidden_field l’ho messo nel
form_for prima di submit…
Grazie mille

ciao,
il modo pi� semplice � inizializzare @comment nel metodo show, scrivendo:

def show

@comment = @neew.comments.new
end

In questo modo @comment avr� gi� neew_id impostato al valore corretto;
poi basta aggiungere da qualche parte in questo form un

<%= f.hidden_field :neew_id %>

pietro

Giorgio A. wrote:

Allora, ho creato nifty_scaffoldando model e controller “comment”, nella
migrazione ho inserito t.references :neew (sarebbero le news, le ho
chiamate in questo modo barbaro perchè chiamandole “new” non mi
funzionava il metodo “new”…roba da matti),

Credo che avresti potuto usare tranquillamente news (notizie, “some
news”), che al singolare… non esiste e si usa solo come aggettivo come
in “a news item”.

Non mi addentro ulteriormente nei percome e nei perché di una lingua non
mia perché le figuracce sono in agguato, ma per Rails il singolare di
news è di nuovo news. Per cui puoi avere un modello News e un controller
NewsController senza dover esporre url artificiose come /neews doverle
poi mappare in /news con delle rotte.

Qui c’è un elenco di tutti i nomi che conviene non usare in Rails per
evitare interferenze con parole chiave o con metodi già usati dal
framework http://wiki.rubyonrails.org/rails/pages/ReservedWords

Paolo

io farei cosi:
nel show, all’interno del ciclo <% form_for @comment do |f| %>
ci piazzeri questo:
<input type=“hidden” name=“neewid” id=“neewid” value="<%=h @neew.id %>"

Nel controller
neew = Neew.find params[:neewid]

e prima di fare il save di comment:
comment.neew = neew

Ciao Michele.

acchio ma perchè le devo scoprire ora ste cose -_-’’’
cmq per quel discorso del neew_id nessuno ne sa niente? non riesco a
uscirne, non me lo salva quando inserisco un commento…

Giorgio A. wrote:

non mi funziona…
forse intendi

si, mi ero perso un _

e nel controller(immagino neews_controller, nell’azione show) intendi
@neew = Neew.find params[:neewid] (che cmq mi da errore)

e la save è quella che fa nel controller dei commenti?

Si.

Ciao Michele.

non mi funziona…
forse intendi

e nel controller(immagino neews_controller, nell’azione show) intendi
@neew = Neew.find params[:neewid] (che cmq mi da errore)

e la save è quella che fa nel controller dei commenti?

Grazie

Michele C. wrote:

io farei cosi:
nel show, all’interno del ciclo <% form_for @comment do |f| %>
ci piazzeri questo:
<input type=“hidden” name=“neewid” id=“neewid” value="<%=h @neew.id %>"

Nel controller
neew = Neew.find params[:neewid]

e prima di fare il save di comment:
comment.neew = neew

Ciao Michele.

con @neew = Neew.find params[:neew_id]
mi da “Couldn’t find Neew without an ID”
io prima avevo questo: @neew = Neew.find(params[:id])
l’unica istruzione che non mi da problemi è quella nella view, però non
fa niente…boh non so che pesci prendere

Michele C. wrote:

Giorgio A. wrote:

non mi funziona…
forse intendi

si, mi ero perso un _

e nel controller(immagino neews_controller, nell’azione show) intendi
@neew = Neew.find params[:neewid] (che cmq mi da errore)

e la save è quella che fa nel controller dei commenti?

Si.

Ciao Michele.

Apri l’html e controlla che sia tutto corretto, in particolar modo il
campo hiden sia nel form.

tra le due istruzioni
@neew = Neew.find params[:neewid]
e
@neew = Neew.find(params[:neewid])

non c’è differenza.
L’errore che ti da è dovuto al fatto che non c’è il parametro.

Michele C. wrote:

Apri l’html e controlla che sia tutto corretto, in particolar modo il
campo hiden sia nel form.

tra le due istruzioni
@neew = Neew.find params[:neewid]
e
@neew = Neew.find(params[:neewid])

non c’è differenza.
L’errore che ti da è dovuto al fatto che non c’è il parametro.

e certo che non c’è il parametro, neew_id(con l’underscore) è un campo
di comment, non di neew

Giorgio A. wrote:

Michele C. wrote:

Apri l’html e controlla che sia tutto corretto, in particolar modo il
campo hiden sia nel form.

tra le due istruzioni
@neew = Neew.find params[:neewid]
e
@neew = Neew.find(params[:neewid])

non c’è differenza.
L’errore che ti da è dovuto al fatto che non c’è il parametro.

e certo che non c’è il parametro, neew_id(con l’underscore) è un campo
di comment, non di neew

no,
@neew.id è l’id di neew. neew_id è il nome del parametro non il valore.
Ripeto controlla l’html verifica che ci sia il campo neew_id con valore
l’id della neew che stai commentando.
Potresti anche mostrarlo il valore con un <%=h @neew.id %>.

allora, ricapitolando:

@neew = Neew.find(params[:neewid])
quest’istruzione mi da errore “Couldn’t find Neew without an ID”,
sia che metta :neewid che :neew_id; inoltre non capisco a cosa serva
cambiare il metodo find, che così com’era funziona bene, e tira fuori la
news che io voglio.

quest’istruzione non capisco cosa faccia…cioè, mi sembra che prenda
l’id della news, ma non capisco cosa ne faccia…a me servirebbe che lo
salvasse in comment.neew_id

comment.neew = neew
questa infine, che ho inserito dentro al metodo create del controller di
comment, prima di save, mi da questo errore(quando schiaccio “submit”
per inserire il commento): NameError in CommentsController#create
undefined local variable or method `comment’ for
#CommentsController:0x4923480
…help!
e dire che mi sembra una cosa così facile…sorry

Giorgio A. wrote:

allora, ricapitolando:

@neew = Neew.find(params[:neewid])
quest’istruzione mi da errore “Couldn’t find Neew without an ID”,
sia che metta :neewid che :neew_id; inoltre non capisco a cosa serva
cambiare il metodo find, che così com’era funziona bene, e tira fuori la
news che io voglio.
ti dico che è la stessa cosa, le parentesi sono opzionali.

quest’istruzione non capisco cosa faccia…cioè, mi sembra che prenda
l’id della news, ma non capisco cosa ne faccia…a me servirebbe che lo
salvasse in comment.neew_id
serve per passare al controller l’id di neew

comment.neew = neew
questa infine, che ho inserito dentro al metodo create del controller di
comment, prima di save, mi da questo errore(quando schiaccio “submit”
per inserire il commento): NameError in CommentsController#create
undefined local variable or method `comment’ for
#CommentsController:0x4923480
prova a mettere @comment

…help!
e dire che mi sembra una cosa così facile…sorry

ok, forse ho capito qual è l’intento…dalla vista passo neew_id con
l’input hidden, e nel controller assegno al campo neew_id del commento
quel valore lì.
il problema è che non lo fa: non riconosce neew_id come variabile
disponibile, x lui è undefined. come faccio a passare effettivamente
questo benedetto numero al mio controller? e, soprattutto, se nel
controller faccio @comment = Comment.new(params[:comment]) e subito dopo
gli metto @comment.neew = neew_id siamo sicuri che va tutto a gonfie
vele?
Grazie ancora

Michele C. wrote:

Giorgio A. wrote:

allora, ricapitolando:

@neew = Neew.find(params[:neewid])
quest’istruzione mi da errore “Couldn’t find Neew without an ID”,
sia che metta :neewid che :neew_id; inoltre non capisco a cosa serva
cambiare il metodo find, che così com’era funziona bene, e tira fuori la
news che io voglio.
ti dico che è la stessa cosa, le parentesi sono opzionali.
ok ^^ non era quello il mio problema, è che a me funziona se metto
@neew = Neew.find(params[:id])

quest’istruzione non capisco cosa faccia…cioè, mi sembra che prenda
l’id della news, ma non capisco cosa ne faccia…a me servirebbe che lo
salvasse in comment.neew_id
serve per passare al controller l’id di neew
ok…prima Pietro G. mi ha suggerito di mettere
<%= f.hidden_field :neew_id %>
sai mica che differenza c’è?

comment.neew = neew
questa infine, che ho inserito dentro al metodo create del controller di
comment, prima di save, mi da questo errore(quando schiaccio “submit”
per inserire il commento): NameError in CommentsController#create
undefined local variable or method comment' for #<CommentsController:0x4923480> prova a mettere @comment messo, ora mi da questo errore: undefined local variable or methodneew’ for
#CommentsController:0x472a9a8

Grazie per lo sbattimento

Giorgio A. wrote:

ok, forse ho capito qual è l’intento…dalla vista passo neew_id con
l’input hidden, e nel controller assegno al campo neew_id del commento
quel valore lì.
il problema è che non lo fa: non riconosce neew_id come variabile
disponibile, x lui è undefined. come faccio a passare effettivamente
questo benedetto numero al mio controller? e, soprattutto, se nel
controller faccio @comment = Comment.new(params[:comment]) e subito dopo
gli metto @comment.neew = neew_id siamo sicuri che va tutto a gonfie
vele?
Grazie ancora

dovrebbe. Purtroppo dovresti mettere a disposizione tutto il codice,
view controller e model.

Per passare un parametro dalla view al controller lo devi impostare nel
form html. TUTTI i parametri del form finisco nel controller sottoforma
di params[:nomecampo]

COMMENTS CONTROLLER:
class CommentsController < ApplicationController
def index
@comments = Comment.all
end

def show
@comment = Comment.find(params[:id])
end

def new
@comment = Comment.new
end

def create
@comment = Comment.new(params[:comment])
if @comment.save
flash[:notice] = “Commento inserito”
redirect_to neews_path(params[@comment.neew_id])
else
render :action => ‘new’
end
end

NEEWS CONTROLLER:

def edit
@neew = Neew.find(params[:id])
end

def create
@neew = Neew.new(params[:neew])

e qui avrei dovuto infilare @comment.neew = neew_id , però non funzionava
respond_to do |format|
if @neew.save
flash[:notice] = ‘Neew was successfully created.’
format.html { redirect_to(@neew) }
format.xml { render :xml => @neew, :status => :created,
:location => @neew }
else
format.html { render :action => “new” }
format.xml { render :xml => @neew.errors, :status =>
:unprocessable_entity }
end
end
end

SHOW.HTML.ERB DELLA NEEW:

<% unless @neew.comments.empty?%>
<%= pluralize(@neew.comments.size, ‘comment’) %>

<% for newsComment in @neew.comments %>
<%= link_to_unless comment.site_url.blank?, h(comment.author_name), h(comment.site_url) %> il <%= comment.created_at.strftime('%b %d, %Y alle %H:%M') %>
<%= comment.content %>

<%= link_to 'Destroy', comment, :method => :delete, :confirm => 'Sei sicuro?' %>

<% end %>
<% end %> <% form_for @comment do |f| %> <%= f.error_messages %>

<%= f.label :site_url %>
<%= f.text_field :site_url %>

<%= f.label :author_name %>
<%= f.text_field :author_name %>

<%= f.label :content %>
<%= f.text_area :content %>

<%= f.submit "Submit" %>

<% end %>

ok, ci sono arrivato che i campi passati dal form stanno in params[], il
problema è che la form in questione salva l’insieme di campi inseriti in
un array(credo), e quando nel controller lancia il metodo new gli passa
tutto l’insieme dei parametri(ovvero site_url=“sito.it”,
author_name=“germano”, content=“questo è un commento di testing”, ma
siccome di default il valore neew_id è impostato a NULL passa anche
neew_id=“NULL”…io voglio che gli passi neew_id="@neew.id")
sto impazzendo

Michele C. wrote:

Giorgio A. wrote:

ok, forse ho capito qual è l’intento…dalla vista passo neew_id con
l’input hidden, e nel controller assegno al campo neew_id del commento
quel valore lì.
il problema è che non lo fa: non riconosce neew_id come variabile
disponibile, x lui è undefined. come faccio a passare effettivamente
questo benedetto numero al mio controller? e, soprattutto, se nel
controller faccio @comment = Comment.new(params[:comment]) e subito dopo
gli metto @comment.neew = neew_id siamo sicuri che va tutto a gonfie
vele?
Grazie ancora

dovrebbe. Purtroppo dovresti mettere a disposizione tutto il codice,
view controller e model.

Per passare un parametro dalla view al controller lo devi impostare nel
form html. TUTTI i parametri del form finisco nel controller sottoforma
di params[:nomecampo]

VITTORIA!!! è bastato mettere, nel controller, @comment.neew_id =
params[:neew_id]
E tutto va bene!!!
GRAZIE MILLE; MI AVETE ILLUMINATO!
A presto!
Giò