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