def save_order @cart = find_cart @cart.items.each do |item| @order = Order.new(
:product_id => item.product.id,
:user_id => session[:user_id],
:quantity => item.quantity,
:total_price => item.price,
:date => params[:order].to_s
)
end
if @order.save
session[:cart] = nil
redirect_to_index(“Zamówienie oddane do realizacji” )
else
render :action => :checkout
end
end
Tylko wydaje mi się że jest to troche nieelegancko, i niezgodnie z zasadami MVC, co powinno być umieszczone w modelu, tak by działała również walidacja.
[code=ruby]def save_order @cart = find_cart @cart.items.each do |item| @order = Order.create_from_item(item, session[:user_id], params[:order].to_s)
end
if @order.save
session[:cart] = nil
redirect_to_index(“Zamówienie oddane do realizacji” )
else
render :action => :checkout
end
end
order.rb
def self.create_from_item(item, user_id, date)
self.new(
:product_id => item.product.id,
:user_id => user_id,
:quantity => item.quantity,
:total_price => item.price,
:date => date
)
end[/code]
Jeżeli w koszyku będzie więcej niż jeden item, to tylko ostatni @order zostanie zachowany - to tak ma być?
end[/code]
Gdy nie jest jakieś pole wypełniane i naciskam “buttona” to nic sie nie dzieje, ani strona nie przechodzi dalej, ani żaden error walidacyjny.
def self.create_from_cart(cart, user)
returning create(:user => user) do |order|
cart.items.each do |cart_item|
order.lines.create(cart_item) #zakładając, że cart_item będzie hashem parametrów
# takich jak nazwa, ilość, cena - cokolwiek chcesz
end
end
end
end
class OrderLine < ActiveRecord::Base
belongs_to :order
end[/code]
Poczytaj o REST, obejrzyj railscasty, życie stanie się prostsze.