Passare parametri da una vista ad un controller

Ciao,

abuso del vs aiuto per un problema banale, ma che non riesco a risolvere
da ieri sera.
Ho un link che richiama la new di un controller come segue:

<%= link_to ‘Feedback’, new_feed_path(:shop_id => @shop.id) %>

(ho provato anche :shop => @shop, ma non cambia nulla)

nel controller aggiungo la righa con * :

def new
@feed = Feed.new

  • @feed.evaluated_shop = Shop.find(params[:shop_id])
    end

def create
@feed = Feed.new(feed_params)
@feed.user = current_user

respond_to do |format|
    if @feed.save
        format.html { redirect_to @feed, notice: 'created.' }
        format.json { render action: 'show', status: :created,

location: @feed }
end
end
end

def feed_params
params.require(:feed).permit(:title, :shop_id, :rating)
end

Il problema e’ che shop_id e’ null. Perche’ ?


FleX
[Linux User #347703 PGP Key ID: 98AA9D3E
FingerPrint: 7D25B 0CE4 898A 22CB F765 E2A5 88B7 4C5C 98AA 9D3E]

Sparo…
…hai provato con <%= link_to ‘Feedback’, new_feed_path(@shop.id) %>

Cos a grandi linee:

  • Controlla con rake routes come viene interpretato il percorso.
  • Controlla prima che tutto funzioni digitando a mano il percorso nella
    barra dell’indirizzo e dopo controlla che l’href sia quello che deve
    essere
    e non qualcos’altro.

se params[:shop_id] null vuol dire che il routing non la interpreta
bene.
E’ una nested resource per caso?

On Wed, Nov 6, 2013 at 9:46 AM, Emanuele DelBono
<[email protected]

l’url richiamata qui: <%= link_to ‘Feedback’, new_feed_path(:shop_id =>
@
shop.id) %>

immagino che apra una new che contiene una form per creare un feedback,
e
che il relativo POST vada a finire nella create di quel controller.

la prima cosa che farei e’ controllare dal log che tra i parametri
passati
alla create ci sia :shop_id

Se NON hai usato un routing in cui lo shop_id e’ incluso nell’url,
allora
devi assicurarti che nella form presente nella pagina new ci sia un
campo
(nascosto) che lo contiene (e quando apri la pagina il campo nascosto
deve
avere il valore giusto

Altra cosa che mi pare da verificare: @feed.evaluated_shop =
Shop.find(params[:shop_id])
In feed immagino che ci sia un campo shop_id, e non magari
evaluated_shop_id, giusto?

ciao,
Luca

Cos a grandi linee:>

  • Controlla con rake routes come viene interpretato il percorso.
  • Controlla prima che tutto funzioni digitando a mano il percorso nella
    barra dell’indirizzo e dopo controlla che l’href sia quello che deve essere
    e non qualcos’altro.

ho provato,ma non e’ un problema di routing, sembra che il parametro
shop_id non venga preservato dalla new alla create.

se params[:shop_id] null vuol dire che il routing non la interpreta bene.
E’ una nested resource per caso?

Non saprei dirti e’ un id di una relazione has_many


FleX
[Linux User #347703 PGP Key ID: 98AA9D3E
FingerPrint: 7D25B 0CE4 898A 22CB F765 E2A5 88B7 4C5C 98AA 9D3E]

Sparo…> …hai provato con <%= link_to ‘Feedback’, new_feed_path(@shop.id) %>

purtroppo non funge


FleX
[Linux User #347703 PGP Key ID: 98AA9D3E
FingerPrint: 7D25B 0CE4 898A 22CB F765 E2A5 88B7 4C5C 98AA 9D3E]

Hai verificato che nella post/get nella request arrivi il dato?

2013/11/6 [email protected] [email protected]

2013/11/6 [email protected] [email protected]

e indietro alla view ?

il fatto e’ che gli oggetti che crei durante l’esecuzione di una action
non
esistono piu’ dopo che la action e’ terminata, quindi non puoi creare
qualcosa nella new e ritrovarlo quando esegui la create. I dati devono
passare per il browser (via URL o parametri nelle form).
In alcuni casi puoi memorizzare nella sessione un dato che deve
persistere
attraverso diverse richieste (stando attento a non cercare di mantenere
in
sessione oggetti completi, ma solo ad esempio i loro id). Ma nel tuo
caso
non mi sembra necessario.

ciao,
Luca

On Wed, Nov 6, 2013 Luca wrote:> immagino che apra una new che contiene
una form per creare un feedback, e

che il relativo POST vada a finire nella create di quel controller.

Esatto

la prima cosa che farei e’ controllare dal log che tra i parametri passati
alla create ci sia :shop_id

confermo, c’e’

Se NON hai usato un routing in cui lo shop_id e’ incluso nell’url, allora
devi assicurarti che nella form presente nella pagina new ci sia un campo
(nascosto) che lo contiene (e quando apri la pagina il campo nascosto deve
avere il valore giusto

questa soluzione funziona !!!Ma non sarebbe meglio settare la variabile
nella new e poi richiamarla dalla create ?Mi chiedo perche’ passarla
avanti e indietro alla view ?
Ho provato a fare diversamente aggiungendo alla create la seguente riga:

@feed = Feed.new(feed_params, :evaluated_shop => @feed.evaluated_shop)

ma non funziona.

Altra cosa che mi pare da verificare: @feed.evaluated_shop =
Shop.find(params[:shop_id])
In feed immagino che ci sia un campo shop_id, e non magari
evaluated_shop_id, giusto?

Esatto.
Grazie a te e agli alttri per avermi risolto il problema


FleX
[Linux User #347703 PGP Key ID: 98AA9D3E
FingerPrint: 7D25B 0CE4 898A 22CB F765 E2A5 88B7 4C5C 98AA 9D3E]

On 11/06/2013 06:09 PM, Luca M. wrote:

il fatto e’ che gli oggetti che crei durante l’esecuzione di una action non
esistono piu’ dopo che la action e’ terminata, quindi non puoi creare
qualcosa nella new e ritrovarlo quando esegui la create. I dati devono
passare per il browser (via URL o parametri nelle form).
In alcuni casi puoi memorizzare nella sessione un dato che deve persistere
attraverso diverse richieste (stando attento a non cercare di mantenere in
sessione oggetti completi, ma solo ad esempio i loro id). Ma nel tuo caso
non mi sembra necessario.

Ho capito, ed effettivamente non mi sembra il caso di metterla come var
di sessione.


FleX
[Linux User #347703 PGP Key ID: 98AA9D3E
FingerPrint: 7D25B 0CE4 898A 22CB F765 E2A5 88B7 4C5C 98AA 9D3E]