Richiamare value da db


#1

Ciao, rieccomi qui con un nuovo gratta capo.
Sto cercando di confrontare dei dati pronti per essere salvati nel db
con alcune value di una tabella precisa.

In modo da evitare dei doppioni.

https://richonrails.com/articles/building-a-shopping-cart-in-ruby-on-rails
Seguendo questa guida, ho costruito il mio carrello, ma in fase di
creazione di OrderItem, ogni volta che si procedere ad aggiungere, si
creano nuovi OrderItem, tutti uguali (se non cambi la quantità).

Io ora vorrei impredire che questo accada, aumentando solo la quantità
se il product_id e uguale al product_id presente nel db.

Qualche consiglio?


#2

Scusa ma qual’ il problema? Quale difficolt hai nell’implementarlo?

Maurizio De Santis

Il giorno 6 giugno 2015 10:20, Xx Xx removed_email_address@domain.invalid ha scritto:


#3

Grazie, Paolo P. per la risposta. (Stranamente sul forum, non
visualizza nulla, vabbé…)


Allora, serve un controller:

Questo e il controller dei carrelli (nel tut, si chiama Order)

class CarrelliController < ApplicationController
def show
@elementi = current_ordine.elementi
end
end

mentre questo e il OrderItem:

class ElementiController < ApplicationController
def create
@ordine = current_ordine
@elemento = @ordine.elementi.new(elemento_params)
@taglia = doppioni
@ordine.save
session[:ordine_id] = @ordine.id
end

def update
@ordine = current_ordine
@elemento = @ordine.elementi.find(params[:id])
@elemento.update_attributes(elemento_params)
@elementi = @ordine.elementi
end

def destroy
@ordine = current_ordine
@no_elementi = current_ordine_destroy
@elemento = @ordine.elementi.find(params[:id])
@elemento.destroy
@elementi = @ordine.elementi
end
private
def elemento_params
params.require(:elemento).permit(:taglia, :quantita, :prodotto_id)
end
end


questo e il modello del controller carrello:

class Ordine < ActiveRecord::Base
belongs_to :stato_ordine

has_many :elementi

before_create :set_stato_ordine

before_save :update_subtotal

def subtotal
elementi.collect { |oi| oi.valid? ? (oi.quantita * oi.unit_price) :
0 }.sum
end
private
def set_stato_ordine
self.stato_ordine_id = 1
end

def update_subtotal
self[:subtotal] = subtotal
end
end


questo e il metodo Elemento

class Elemento < ActiveRecord::Base
belongs_to :prodotto
belongs_to :ordine

validates :quantita, presence: true, numericality: { only_integer:
true, greater_than: 0 }

validate :prodotto_presente
validate :ordine_presente

before_save :finalize

def unit_price
if persisted?
self[:unit_price]
else
prodotto.prezzo
end
end

def total_price
unit_price * quantita
end

private
def prodotto_presente
if prodotto.nil?
errors.add(:prodotto, “…non valido.”)
end
end

def ordine_presente
if ordine.nil?
errors.add(:ordine, “Non e un ordine valido.”)
end
end

def finalize
self[:unit_price] = unit_price
self[:total_price] = quantita * self[:unit_price]
end
end


questo e il mio schema

create_table “elementi”, force: :cascade do |t|
t.decimal “unit_price”, precision: 12, scale: 3
t.integer “quantita”
t.text “taglia”
t.decimal “total_price”, precision: 12, scale: 3
t.integer “prodotto_id”
t.integer “ordine_id”
t.datetime “created_at”, null: false
t.datetime “updated_at”, null: false
end

add_index “elementi”, [“ordine_id”], name:
“index_elementi_on_ordine_id”
add_index “elementi”, [“prodotto_id”], name:
“index_elementi_on_prodotto_id”


e le routs:

resources :payment_notifications
resources :elementi, only: [:create, :update, :destroy]
resource :carrelli, only: [:show]
resources :categorie
resources :prodotti
resource :ordine

ecco qui, credo di non aver dimenticato nulla :slight_smile:


#4

Maurizio De Santis wrote in post #1174675:

Scusa ma qual’ il problema? Quale difficolt hai nell’implementarlo?

Maurizio De Santis

Il giorno 6 giugno 2015 10:20, Xx Xx removed_email_address@domain.invalid ha scritto:

Ho provato a modificare il mio create in ElementiController, cosi:

def create
@ordine = current_ordine

if @ordine.elementi.collect { |x| x.prodotto_id == prodotto.id }
  @ordine = current_ordine
  @elemento = @ordine.elementi.find(4)
  @elemento.update_attributes(elemento_params)
  @elementi = @ordine.elementi

else
  @ordine = current_ordine
  @elemento = @ordine.elementi.new(elemento_params)
  @ordine.save
  session[:ordine_id] = @ordine.id
end

end

Purtroppo la variabile prodotto.id, mi da errore, NameError (undefined
local variable or method `prodotto’ for
#ElementiController:0xb4d78804)

:frowning:


#5

La butto l…fai riferimento a prodotto ma prodotto non esiste?

P.S.
Please don’t code in Italian…:frowning:

Alessandro R.


#6

Maurizio De Santis wrote in post #1174675:

Scusa ma qual’ il problema? Quale difficolt hai nell’implementarlo?

Maurizio De Santis

Il giorno 6 giugno 2015 10:20, Xx Xx removed_email_address@domain.invalid ha scritto:

Il mio obbiettivo e quello di impedire la creazione di tanti elementi
tutti uguali…
Esempio:

Trovo il prodotto e lo aggiungo, olé tutto okey.
Trovo un altro prodotto e lo aggiungo, ancora tutto okey.
Ora mi sono reso conto che voglio aggiungere ancora il primo prodotto
che ho inserito in precedenza, con l’obbiettivo di aumentare la
quantita’

(dato che il prodotto_id e già inserito e con lui e stato creato anche
l’elemento.)

Solo che ogni volta che clicchi sullo stesso tasto di “Aggiungi
all’carrello”, viene creato sempre un nuovo elemento.


#7

Tu usi la variabile prodotto nel metodo create ma non esiste quella
variabile.
Mi associo al don’t code in Italian.

2015-06-09 16:08 GMT+02:00 Alessandro R. removed_email_address@domain.invalid:

Scusa ma qual’ il problema? Quale difficolt hai nell’implementarlo?
@ordine = current_ordine
@ordine.save

http://lists.ruby-it.org/mailman/listinfo/ml

$ cd /pub
$ more beer

I pirati della sicurezza applicativa: https://codiceinsicuro.it


#8

Alessandro R. wrote in post #1174809:

La butto l…fai riferimento a prodotto ma prodotto non esiste?

P.S.
Please don’t code in Italian…:frowning:

Alessandro R.

Si che esiste, il create viene lanciato dalla pagina del prodotto (e
l’id e passato dal url), che a sua volta lancia il create dal
controller.

Io vorrei passare l’id che si trova nel url, al method create in
ElementiController


#9

def create
@ordine = current_ordine

if ( @ordine.elementi.collect { |x| x.prodotto_id == prodotto.id

}.include?(true) ) == true
@ordine = current_ordine
@elemento = @ordine.elementi.find(4)
@elemento.update_attributes(elemento_params)
@elementi = @ordine.elementi

else
  @ordine = current_ordine
  @elemento = @ordine.elementi.new(elemento_params)
  @ordine.save
  session[:ordine_id] = @ordine.id
end

end

ho modificato il mio create ulteriormente, cosi da ottenere true e
aggiornare invece di creare un nuovo elemento.
Solo che ora per farlo funzionare ho bisogno del id del prodotto, che mi
viene fornito dal url
myapp/prodotto/:id, ma non lo riceve l’id.

qualche consiglio?


#10

Paolo P. wrote in post #1174821:

No, prodotto non dichiarata altrimenti il tuo codice funzionerebbe :slight_smile:


Posted via http://www.ruby-forum.com/.


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


$ cd /pub
$ more beer

I pirati della sicurezza applicativa: https://codiceinsicuro.it

Prodotto e passato tramite il model con belongs_to :prodotto .
Infatti, li l’id non rimane vuoto.
Ma non mi serve nel model ma nel controller, l’id


#11

Ora ho provato anche, scrivere il controllo dentro il mio model
Elemento, ma ho il problema contrario ora.

Riesco ad avere prodotto.id ma non riesco ad accedere alla tabella
Elementi.

Quindi se nel controller Elementi non riesco a richiamare l’id presente
nel url ( my_app/prodotti/1 ) e nel model non riesco a richiamare la
colonna contenente gli id dei prodotti.

Come posso, verificare i miei elementi, in cerca del id prodotto, da
confrontare con l’id che mi viene passato dal url?


#12

“Ma non mi serve nel model ma nel controller l’id”

Infatti… nel tuo controller devi accedere ai parametri della richiesta
HTTP.

In sinatra farei qualcosa del tipo
prodotto = Product.get(params[:product_id])

2015-06-11 15:28 GMT+02:00 Xx Xx removed_email_address@domain.invalid:

Ma non mi serve nel model ma nel controller l’id


Posted via http://www.ruby-forum.com/.


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


$ cd /pub
$ more beer

I pirati della sicurezza applicativa: https://codiceinsicuro.it


#13

ciao Kira, se pubblichi il tuo progetto su github.com o, alla peggio,
zippi
tutta la cartella app/ della tua applicazione Rails e carichi lo zip su
uno
spazio di condivisione (come Dropbox), è meglio, così riusciamo subito a
capire qual’è il problema :slight_smile:

2015-06-11 17:15 GMT+02:00 Xx Xx removed_email_address@domain.invalid:


#14

No, prodotto non dichiarata altrimenti il tuo codice funzionerebbe :slight_smile:

L’id non viene passato per magia nei controller, ma devi leggerlo tra
i parametri (io uso sempre sinatra e mai rails, quindi cerca
eventualmente come leggere parametri dalla view dentro il controller)

unless params[:id].nil?
id=params[:id]
prodotto=Prodotto.get(id)
else
prodotto = Prodotto.new
end

Paolo

2015-06-09 17:09 GMT+02:00 Xx Xx removed_email_address@domain.invalid:

controller.

Io vorrei passare l’id che si trova nel url, al method create in
ElementiController


Posted via http://www.ruby-forum.com/.


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


$ cd /pub
$ more beer

I pirati della sicurezza applicativa: https://codiceinsicuro.it


#15

Apri un gist qui: https://gist.github.com/ cos siamo tutti pi
produttivi e possiamo ragionare codice alla mano…

2015-06-11 17:34 GMT+02:00 Xx Xx removed_email_address@domain.invalid:

Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


$ cd /pub
$ more beer

I pirati della sicurezza applicativa: https://codiceinsicuro.it


#16

Apri un gist e metti il codice :slight_smile:

2015-06-11 17:40 GMT+02:00 Paolo P. removed_email_address@domain.invalid:

$ cd /pub
$ more beer

I pirati della sicurezza applicativa: https://codiceinsicuro.it


$ cd /pub
$ more beer

I pirati della sicurezza applicativa: https://codiceinsicuro.it


#17

purtroppo in rails genera un errore " undefined method `get’ " =_=

E da quello che leggo ( e studiato in rails ), il controller ( in teoria
) non ha accesso diretto al db, ma e il model che si incarica di
guardare dentro il db ( da quello che ho capito),
ma se ciò fosse vero, non potrei fare neanche collection =|


#18

@paolo: +1 per il gist
@Kira: metti il codice nel gist, che altrimenti è dura :slight_smile:


#19

Maurizio De magnis wrote in post #1174945:

@paolo: +1 per il gist
@Kira: metti il codice nel gist, che altrimenti è dura :slight_smile:

si okey, ma forse ho risolto

utilizzando request.path, ottengo " product/:id " ,

ma vorrei isolare " :id " consigli?


#20

Ci sono persone che ti stanno dedicando il loro tempo, aiutale ad
aiutarti
:slight_smile:

2015-06-11 18:01 GMT+02:00 Xx Xx removed_email_address@domain.invalid: