Zapisywanie danych manualnie model/controller

Witam,

Obsługuje formularz, w ten sposób:

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.

Może coś takiego:

[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ć?

no nie do końca, zapisywać ma wszystkie rekordy, i zapisuje, tylko że walidacja nie działa,

[code]def save_order
@cart = find_cart
@order = Order.new
if @order.create_from_item(@cart, session[:user_id], params[:order].to_s)
session[:cart] = nil
redirect_to_index(“Zamówienie oddane do realizacji” )
else
render :action => :checkout
end
end

#order.rb
def create_from_item(cart, id, date)
cart.items.each do |item|

 @order = Order.new(
    :product_id => item.product.id,
    :user_id => id,
    :quantity => item.quantity,
    :total_price => item.price,
    :date => date
  )
  break unless @order.save
end

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.

http://railscasts.com/episodes/73-complex-forms-part-1
http://railscasts.com/episodes/74-complex-forms-part-2
http://railscasts.com/episodes/75-complex-forms-part-3

może to Ci pomoże?

Poza tym, czy nie prościej by było mieć dwa modele?

[code=ruby]class Order < ActiveRecord::Base
has_many :lines, :class => “OrderLine”
belongs_to :user

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.

dzięki sevos, pomogłeś!