Chiamare da vista metodi di un controller

Salve a tutti,
sto realizzando un progettino di prova in rails 3 con DBMS mysql.
Ho un controller products_controller che gestisce le operazioni di
creazione cancellazione modifica di un prodotto,all’interno dello stesso
ho index che con la gemma paginate e metasearch mi mostra i prodotti
presenti nel db.
Quindi ho la vista index che chiama il parziale _product su ogni
prodotto. Vorrei mettere su ogni prodotto un tasto aggiungi che esegue
un metodo contenuto in products_controller, il metodo add_cart che mi
sono implementato che cerca il prodotto nel db partendo dall’id e lo
aggiunge al carrello.
Come posso fare? devo usare form_tag?
devo modificare routes.rb?

Il 14/04/2011 19:13, fabio fronda ha scritto:

aggiunge al carrello.
Come posso fare? devo usare form_tag?
presumibilmente, se un’azione tipo add_to_cart, direi che si tratta di
una
POST, quindi si, dovresti usare una form (scritta a mano o tramite
helper, poco
cambia :P)

devo modificare routes.rb?
si, devi aggiungere una rotta che punta alla action del controller,
altrimenti
rails non sa dove girare la richiesta.

se hai altri dubbi/problemi, chiedi pure :slight_smile:

A.

Il giorno 14 aprile 2011 20:25, Andrea P. [email protected] ha
scritto:

sono implementato che cerca il prodotto nel db partendo dall’id e lo

Scusate, ma l’helper link_to con :method POST non dovrebbe bastare?
Dovrebbe
creare automaticamente la form per fare il submit

si, ma vuol dire sfruttare il JS per trasformare la GET in POST, visto
che il
markup generato un normale link.

come nota a margine, la regola da seguire sarebbe quella di usare la GET
per
fare richieste che NON coinvolgono cambiamenti sul db, e la POST per gli
altri
casi. nello specifico, aggiungere un item nel carrello virtuale, secondo
me,
rientra nel secondo caso :stuck_out_tongue:

ciao,
A.

Il 14/04/2011 23:19, Duncan ha scritto:

Il giorno 15 aprile 2011 16:58, Andrea P. [email protected] ha
scritto:

rientra nel secondo caso :stuck_out_tongue:

ciao,
A.

Grazie per l’informazione :smiley:

grazie per le dritte.
Tuttavia non riesco a risolvere.
in routes.rb ho aggiunto
resources :cart , :except => [:new, :create, :edit, :update, :index]
do
member do
post ‘add_product’
end
end

e sul parziale _product ho inserito

ma quando carico la pagina che dovrebbe mostrare il tasto aggiungi il risultato è: No route matches {:action=>"add_product", :controller=>"cart"}

ho il file cart_controller dove ho definito il metodo add_product.

poichè il metodo effettua una ricerca Product.find(params[:id])
come faccio a far passare l’id nel form?

Il 16/04/2011 15:07, fabio fronda ha scritto:

grazie per le dritte.
Tuttavia non riesco a risolvere.
in routes.rb ho aggiunto
resources :cart , :except => [:new, :create, :edit, :update, :index]
do
member do
get ‘add_product’
end
end

qui potresti essere pi sintentico con:

resources :cart, :only => [:show, :destroy] do
post ‘add_product’, :on => :member
end

inoltre, come vedi, ho usato una POST, non una GET. funzionerebbe anche
con la
GET, ma ha poco senso e ti esporrebbe a qualche rischio pratico.

e sul parziale _product ho inserito

ma quando carico la pagina che dovrebbe mostrare il tasto aggiungi il risultato : No route matches {:action=>"add_product", :controller=>"cart"}

essendo un’azione che va chiamata su un oggetto passato (un prodotto da
aggiungere nel carrello), nella form devi mettere un id. quindi potresti
usare
una form in questo modo:

form_for(@item, :url => add_product_cart_path(@item)) do |f| %>

<% end %>

ho il file cart_controller dove ho definito il metodo add_product.

poich il metodo effettua una ricerca Product.find(params[:id])
come faccio a far passare l’id nel form?

appunto, quello che ti ho scritto poco sopra :wink:

A.

Ho risolto in maniera un pò strana.
Ho utilizzato:
<%=link_to “aggiungi”, add_product_cart_path(product), :method=>“post”%>

Sicuramente sbaglio qualcosa nel form. Non ho ancora capito come
utilizzarlo…

Il giorno 16 aprile 2011 18:22, fabio fronda [email protected] ha
scritto:

Ho risolto in maniera un p strana.
Ho utilizzato:
<%=link_to “aggiungi”, add_product_cart_path(product), :method=>“post”%>

Sicuramente sbaglio qualcosa nel form. Non ho ancora capito come
utilizzarlo…

Anche io avevo utilizzato per un problema simili il link_to, liscio via
GET,
ma ho modificato come suggerito per far funzionare il tutto con una form
via
tag, questo il codice nella view, una partial

Titolo <%= title.description %> <%= form_tag :action => :update_subscriptions do %> <%= hidden_field_tag :title_id, title.id %> <% if add %> <%= hidden_field_tag :add_action, add %> <% end %> <%= submit_tag label %> <% end %>

L’unico prbema che ho con l’hidden_field_tag di add_action, sono stato
costretto a metterlo dentro un IF perch quando add false nel controller
non funzionava il parametro lo leggo cos:

if params[:add_action]

Grazie. Il routes lo sistemato come hai suggerito, è più pulito.
Sono riuscito a farlo funzionare utilizzando:

mentre con <%form_for(product, :url => add_product_cart_path(product)) do |f| %> <%=f.submit "Aggiungi"%> <% end %> quando premo su aggiungi da: No route matches "/cart/1/add_product"

inoltre utilizzo session per mantenere in memoria il carrello prima di
confermare e mettere tutto sul database, nel cart_controller ho
before_filter :init_cart
def init_cart
if session[:cart].nil?
@cart=Cart.new
session[:cart]=@cart
else
@cart=session[:cart]
end
end

Il problema è che session[:cart] non resta in memoria, infatti ho
provato con Rails.logger per vedere i valori che assume e ogni volta che
si preme aggiungi il carrello viene reinizializzato perchè
session[:cart] non esiste.

Il giorno 19 aprile 2011 23:23, Duncan [email protected] ha scritto:

utilizzarlo…
<%= hidden_field_tag :title_id, title.id %>

if params[:add_action]

Ho sbagliato e mi ha inviato il messaggio incompleto… continuo qui

if params[:add_action]
faccio qualcosa se vero
else
faccio qualcosa se falso (non esege)
end

redirect_to …

non da errore ne altro, anche se nell’hidden c’ false esegue comunque la
prima parte…