Witam,
zaznaczam że w RoRze (i ogólnie w Rubim) kodzę dopiero pierwszy dzień i trochę się gubię.
Idea jest taka - serwis, który przechowuje nagrody, z możliwością ich wylosowania (autoryzacja przez http). Mam oddzielne nagrody dla dwóch “obozów”, czyli jak zwycięzca jest z 1 obozu, losuję nagrodę z 1, jak z 2 to losuję z 2 : )
Tabela winners prezentuje się tak:
nick:string -> nick tego, który bierze udział w loterii
fraction:string -> oboz tego, ktory bierze udzial w loterii
reward:references -> jaką nagrodę wylosował
Rewards:
name:string -> nazwa
ally:integer -> ilosc tej nagrody w 1 obozie
horda:integer -> ilosc tej nagrody w 2 obozie
rate:integer -> wartosc nagrody, im wyzsza ta liczba, tym latwiej trafic ta nagrode
Kontroler winners:
[code=ruby] def new
@winner = Winner.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @reward }
end
end
POST /winners
POST /winners.xml
def create
@winner = Winner.new(params[:winner])
respond_to do |format|
if @winner.save
available_rewards = Reward.where(["? > ?", @winner.fraction, 0])
array = []
available_rewards.each do |reward|
howmany = reward.rate * reward.ally if @winner.fraction == 'ally'
howmany = reward.rate * reward.horda if @winner.fraction == 'horda'
howmany.times do
array.push(reward.id)
end
end
array.shuffle
reward = Reward.find(array[rand(array.size)])
reward.ally = reward.ally - 1 if @winner.fraction == 'ally'
reward.horda = reward.horda - 1 if @winner.fraction == 'horda'
reward.save
@winner.reward = reward.id
@winner.save
format.html { redirect_to('/winners', :notice => @winner.nick+' wygrywa '+reward.name+'.') }
format.xml { render :xml => @winner, :status => :created, :location => @winner }
else
format.html { render :action => "new" }
format.xml { render :xml => @winner.errors, :status => :unprocessable_entity }
end
end
end[/code]
Formularz losowania:
[code=ruby]
Losuj nagrodę
<%= form_for(@winner) do |f| %>
<% if @winner.errors.any? %>
<%= pluralize(@winner.errors.count, "error") %> błędów:
-
<% @winner.errors.full_messages.each do |msg| %>
- <%= msg %> <% end %>
<%= f.text_field :nick %>
<%= f.text_field :fraction %>
<%= link_to ‘Wróć’, rewards_path %>[/code]
Efekt jest taki, że po wypełnieniu formularza, przechodzi do /winners (listy zwyciezcow) i… właściwie tyle. Nie ma zwycięzcy, ilość nagród nie została odjęta… Co tu jest źle, bo nawet logi serwera specjalnie nic mi nie mówią, ale wydaje mi się (zresztą, to chyba oczywiste), że formularz nie przechodzi do “create”. Pozdrawiam
Świstak
EDIT: Tak, może dodam jak chciałem rozwiązać (i jak wcześniej rozwiązałem w PHP) losowanie nagrody.
Dodaję tyle razy do tablicy daną nagrodę, wynik mnożenia rate, czyli wartości (im większa, tym łatwiej trafić) i ilości danej nagrody “na magazynie” w danej frakcji. Czyli np. dla rate = 5 i ilości 7 dla ally, wrzucam 35 razy do tablicy ID tej nagrody. Potem wszystko mieszam, mieszam, losuję jeden z tablicy - i powinienem mieć nagrodę. Potem formalności, czyli dodanie zwycięzcy do bazy, odjęcie 1 sztuki danej nagrody w danym obozie i tyle : )