Problem zakładów sportowych dodawanie odpowiednich wyników

Witam wszystkich.

Robię pewny projekt na zajęcia w ror a mianowicie, system zakładów sportowych.

Mam taki problem. Gdyż w każdym meczu może byc zwycięstwo drużyny 1 albo 2 lub także może byc też remis. No i problem mój polega na tym, że jak kliknę na przycisk dodaj kurs do kuponu cały czas przypisuje mi tylko wartosc z pierwszego wiersza.

przykładowy jeden mecz z kolejki:

[code]

<%= primeradivision.czas_zam1 %> <%= primeradivision.zdarzenie1 %> <%= primeradivision.typ11 %> <%= button_to "dodaj", :action => :add_to_cart, :id =>primeradivision, :typ11 =>primeradivision.typ11 %> <%= primeradivision.typ1x %> <%= button_to "dodaj", :action => :add_to_cart, :id =>primeradivision, :typ1x =>primeradivision.typ1x %> <%= primeradivision.typ12 %> <%= button_to "dodaj", :action => :add_to_cart, :id =>primeradivision, :typ12 =>primeradivision.typ12 %> [/code] Mój plik add_to_cart [code]

Twój kupon

<% for item in @cart.items %> <% end %>
<%= h(item.zdarzenie1) %> <%= number_to_currency(item.typ11, :seperator => ",") %>
<%= button_to "Wyczyść kupon", :action =>:empty_cart %>[/code] Próbowałem różnych kombinacji z if i nie działa i stoję w miejscu że tak powiem a czas goni. Chodzi mi o to głównie że po kliknięciu na odpowiedni batton zostanie przypisana i wyświetlona odpowiednia wartośc.

Proszę o pomoc, jeśli nie jasno napisałem to pytajcie.

Pokaż akcję add_to_cart.

Jest wypisana w poście.

Z kontrolera?

def add_to_cart ... cos co prawdopodobnie jest zle ... end

no tak zapomniałem dopisac:

def add_to_cart begin primeradivision = Primeradivision.find(params[:id]) rescue ActiveRecord::RecordNotFond logger.error("Próba dostępu do nieistniejącego kuponu: #{params[:id]}") redirect_to_index("Nieprawidłowy zakład") else @cart = find_cart @cart.add_primeradivision(primeradivision) redirect_to_index end end

Cześć,

[quote=onekick]no tak zapomniałem dopisac:

def add_to_cart begin primeradivision = Primeradivision.find(params[:id]) rescue ActiveRecord::RecordNotFond logger.error("Próba dostępu do nieistniejącego kuponu: #{params[:id]}") redirect_to_index("Nieprawidłowy zakład") else @cart = find_cart @cart.add_primeradivision(primeradivision) redirect_to_index end end
[/quote]
No nie mówiłem że tu coś będzie źle?

Primeradivision.find(params[:id]) znajdzie zawsze ten sam rekord bo te parametry :typ1x itd. nie są brane pod uwagę.

próbowałem wcześniej dopisywac w kontrolerze, tego typu rzeczy ale dalej był problem, chyba że źle to robie

primeradivision = Primeradivision.find(params[:typ11]) primeradivision = Primeradivision.find(params[:typ1x]) primeradivision = Primeradivision.find(params[:typ21])
a jeśli jeszcze dopisałem if…else przy wyświetlaniu to wywala mi błąd:
uninitialized constant ActiveRecord::RecordNotFond

NO i teraz już sam nie wiem co mam wypisywac w kontrolerze, a co w widoku żeby poprawnie wyświetlało.

[quote=onekick]próbowałem wcześniej dopisywac w kontrolerze, tego typu rzeczy ale dalej był problem, chyba że źle to robie

primeradivision = Primeradivision.find(params[:typ11]) primeradivision = Primeradivision.find(params[:typ1x]) primeradivision = Primeradivision.find(params[:typ21])
a jeśli jeszcze dopisałem if…else przy wyświetlaniu to wywala mi błąd:
uninitialized constant ActiveRecord::RecordNotFond[/quote]
Zajrzyj do dokumentacji Railsów i zobacz jak dziala metoda ActiveRecord::Base.find której używasz (podpowiedź: szuka rekordu po kolumnie “id” i wywala wyjątek gdy nie znaleziono).

Ty potrzebujesz wyszukać rekord o danym ID ale również (tak mi się wydaje) o typ1x równym coś tam innego. Może coś takiego zadziała:

Primeradivision.find_by_id_and_typ1x!(params[:id], params[:typ1x])

(w przypadku typ1x).

Poza tym robisz jeszcze kilka rzeczy nie ładnie ale to nie wiąże się z tematem pytania więc jak będziesz chciał to Ci podpowiem jak pisać kod lepiej, jak nie to nie :wink:

Ten kod działa dla każdej wartości, ale tylko w pojedynkę, próbuję aby dwie lub trzy wartości były rozpoznawane przy jednym meczu i tak dalej przy kolejnym meczu.

Primeradivision.find_by_id_and_typ1x!(params[:id], params[:typ1x])

A poza tym to, które rzeczy robię źle, chodzi o button_to?;]

Nie chodzi o to że jakoś tragicznie źle ale jest (moim zdaniem dobra) tendencja do używania REST w RoR. Chodzi o to że nie masz akcji typu “add_to_someting”, “remove_from_something” etc. a poslugujesz się 4 metodami HTTP oraz odpowiedniego zasobu do określenia na czym to ma operować. W pierwszym momencie może wydać to się głupie i sztuczne ale jak się o tym dłużej pomyśli to ma sens.

Np. spójrz na logowanie. /login i /logout są ok. Ale co tak na prawdę robisz podczas logowania? Tworzysz sesję. Co robisz podczas wylogowania? Usuwasz sesję. No to można zrobić to ładniej:

[GET] /session/new --> login i hasło do formularza --> [POST] /session (weryfikacja loginu i hasła) --> zalogowany
[DELETE] /session -> wylogowany

a w Twoim przypadku jest jakiś koszyk, więc może:

[GET] /chart (listing produktów w koszyku)
[POST] /chart (dodanie elementu do koszyka)
[DELETE] /chart/12345 (usuniecie elementu z koszyka) itd.

To jedno.

Dwa, co mi się nasuwa to że używanie wyjątków do sterowania ciągiem instrukcji programu jest mało ładne.

Zamiast:

begin MojObiekt.save! rescue flash[:notice] = "Oops" redirect_to_index end
lepiej jest użyć:

unless MojObiekt.save flash[:notice] = "oops" redirect_to_index end
i krócej i przede wszstkim bardziej czytelnie.

Co do drugiego to postaram się to zmienic, jeśli chodzi o pierwszy to czy mam rozumiec, że lepiej będzie utworzenia nowej tabeli w bazie danych, która
będzie przechowywac informacje o meczach, które zostały dodania do kuponu? Hm pomyślę nad tym, bo w sumie to nadal nie mogę zrobic tak, żeby był dodawany ten kurs, który mnie interesuje.

Mam taki problem nie wiem, czemu nie widzi u mnie metody

[code]undefined method `laliga’ for #Laliga:0x4b7c68c

d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/attribute_methods.rb:260:in method_missing' D:/Ruby/projekty/zaklady/site/app/models/cart.rb:9:inadd_laliga’
D:/Ruby/projekty/zaklady/site/app/models/cart.rb:9:in each' D:/Ruby/projekty/zaklady/site/app/models/cart.rb:9:infind’
D:/Ruby/projekty/zaklady/site/app/models/cart.rb:9:in add_laliga' D:/Ruby/projekty/zaklady/site/app/controllers/store_controller.rb:10:inadd_to_cart’[/code]
model cart.rb

[code]class Cart
attr_reader :items

def initialize
@items = []
end

def add_laliga(laliga)
current_item = @items.find { |item| item.laliga == laliga }
if current_item
current_item.increment_quantity
else
@items << CartItem.new(laliga)
end
end

end[/code]
model cart_item.rb

[code]class CartItem

attr_reader :laliga, :quantity

def initialize(laliga)
@laliga = laliga
@quantity = 1
end

def increment_quantity
@quantity += 1
end

def zdarzenie
@laliga.zdarzenie
end

def typ1
@laliga.typ1 * @quantity
end

def typx
@laliga.typx * @quantity
end

def typ2
@laliga.typ2 * @quantity
end

end[/code]
kontroler store_controller.rb

[code]class StoreController < ApplicationController

def index
@laligas = Laliga.find_laligas_for_sale
end

def add_to_cart
@cart = find_cart
laliga = Laliga.find(params[:id])
@cart.add_laliga(laliga)
end

private
def find_cart
session[:cart] ||= Cart.new
end

end[/code]
oraz widok add_to_cart.rhtml

[code]

Twój kupon

<% for cart_item in @cart.items %> <% end %>
<%= cart_item.quantity %> × <% h(cart_item.zdarzenie) %>
[/code]

[quote=onekick]Mam taki problem nie wiem, czemu nie widzi u mnie metody

undefined method `laliga' for #<Laliga:0x4b7c68c>

[/quote]
Model Laliga nie posiada metody laliga, odwołujesz się do niej w metodzie add_laliga w modelu Cart.

no tak zgadza się, więc dlaczego mi taki błąd wyskakuje? jest jakiś problem z metodą add_laliga?

A co to jest laliga ? :smiley:

może spróbuj w modelu CartItem dać attr_accessor :laliga
howsiak: to coś z włoskiego pewnie :slight_smile:

Jakiś płaz, albo rodzaj cukierka. :slight_smile:

heretycy!
to hiszpańska ekstraklasa (w zasadzie to potoczna nazwa Primera Division :wink: )

to każda liga ma swój model ? dlaczego ?

nie zadziałało, pojawił się inny problem wówczas, też nie wiadomo skąd.
zmieniłem tylko w modelu cart.rb na:
def add_laliga(laliga)
@items << laliga
end

i działa.

Widzę, że co poniektórzy znają się na piłkarskich ligach zagranicznych:)

każda liga ma jeden model tylko został tak nazwany, ponieważ wcześniej jak robiłem (próbowałem coś robic) i jak mi nie wychodziło to usuwałem dany model wraz z migracją i później nie mogłem od nowa tworzyc takiego samego modelu wraz z migracjami, gdyż pojawiał się błąd, że taka migracja istnieje, dlatego też nie mogę już stworzyc migracji np:(liga, kupon) chce podkreślic że działam pod windowsem nie wiem czy to wina tego systemu czy co, podobnie sytuacja wyglądała z bazą danych, ale zostawiłem to bo straciłem już wiele czasu na ten system. Po sesji zaczynam działac na ubuntu;]

[code]

<%= laliga.czas_zam %> <%= laliga.zdarzenie %> <%= laliga.typ1 %> <%= button_to "dodaj", :action => :add_to_cart, :id =>laliga %> <%= laliga.typx %> <%= button_to "dodaj", :action => :add_to_cart, :id =>laliga %> <%= laliga.typ2 %> <%= button_to "dodaj", :action => :add_to_cart, :id =>laliga %> [/code] takie zapytanie, jak zrobic żeby po kliknięciu na dany button wiedział jaki kurs pobrac? bo same id nie wystarcza on wie tylko jakie to jest zdarzenie (mecz) a typ1, typx, typ2 są kursami..