Nie wiem czy ma w tym przypadku to do rzeczy, że jest to table less model (via http://railscasts.com/episodes/219-active-model),
ale możliwe, że nie dołączyłem jakiegoś modułu.
Controller:
[code] def new
@points_transfer = PointsTransfer.new
end
def create
@points_transfer = PointsTransfer.new(params[:points_transfer])
@points_transfer.sender = current_user
if @points_transfer.save
redirect_to panel_path, :notice => "Przelałeś użytkownikowi #{@points_transfer.receiver.username} #{@points_transfer.amount} punktów."
else
redirect_to panel_path, :notice => "Podczas wysyłania punktów wystąpił błąd."
end
end[/code]
[code]class PointsTransfer
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :sender, :receiver
attr_reader :receiver, :amount
validate :amount_cannot_be_greater_than_sender_points
validates :amount, :presence => true
validates :receiver, :presence => true
def amount_cannot_be_greater_than_sender_points
errors.add(“Ilość punktów”, “nie może być wieksza niz ilosc posiadanych punktow”) if
@sender.points < @amount
end
def receiver=(val)
@receiver = User.find_by_username(val)
end
def amount=(val)
@amount = val.to_i
end
def save
if valid?
apply
end
end
def apply
@sender.points -= @amount
@receiver.points += @amount
@sender.save
@receiver.save
end
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
end
def persisted?
false
end
end[/code]
Czy da się zastąpić walidację amount_cannot_be_greater_than_sender_points przez coś w tym stylu:
validates :amount, :numericality => {
:greater_than_or_equal_to => @sender.points
}
Powyższy kod mi wypluwa błąd, że brak metody ‘points’ dla @sender, który jest nil.
Co właściwie jest racją, bo nie mam pojęcia, dlaczego walidacja jest odpalana w metodzie new.