before_filter czy dobrze?

Witam, mam pytanie czy filter który napisałem jest bezpieczne, tzn czy nie da się go jakoś łatwo obejść preparując link. Mam modele duel oraz bet(relacja duel has_many bets), stworzyłem filter który pozwala tworzyć nowe bety tylko gdy duel jeszcze się nie rozpoczął. Mam taki kod.

[code=‘ruby’]before_filter :check_date, :only => [:new, :edit]

protected

def check_date
@duel = Duel.find(params[:duel_id])
if @duel.date < Time.now then
redirect_to duel_bets_path(@duel)
end
end[/code]
Filter działa dobrze, kiedy chcę stworzyć nowy bet przekierowuje mnie na poprawna stronę, jednak nie wiem czy na pewno nie będzie się dało utworzyć nowego obiektu poprzez spreparowanie linku. Czy filtry tego typu pisze się właśnie tak czy może jakoś inaczej ?

[quote=Cz4cha]before_filter :check_date, :only => [:new, :edit]
[/quote]
No podstawa to sprawdzić też akcje create i update żeby ktoś sobie preparując rządanie bet nie stworzył.

Jeżeli twoja logika w widokach nie pokazuje linku do duels/id/bet/new dla duela, który się jeszcze nie zaczął, to ja bym zrobił walidację w modelu bet. Sprawdzała by ona czy powiązany duel już się zaczął.

Jeżeli ktoś spreparuje request nie ma sensu go przekierowywać - niech dostanie głupią odpowiedź albo 500…

Czy taka validacja będzie dobra ?

[code=‘ruby’]validate :duel_start_date_cannot_be_in_the_past

protected

def duel_start_date_cannot_be_in_the_past
@duel = Duel.find_by_id(self.duel_id)
if @duel.date < Time.now
redirect_to duel_bets_path(@duel)
end
end[/code]
zmienię później to przekierowanie na jakiś błąd, ale na razie nie mam jeszcze wstawionego wyświetlania błędów. Mógłby ktoś podać mi przykład spreparowanego requestu ? ponieważ nie wiem jak dokładnie on wygląda i nie mogę sprawdzić ;p przy tworzeniu betu przekazuję parametry winner:string i gold:integer i pobierany jest jeszcze duel_id z parametów

[quote=Cz4cha]Czy taka validacja będzie dobra ?

[code=‘ruby’]validate :duel_start_date_cannot_be_in_the_past

protected

def duel_start_date_cannot_be_in_the_past
@duel = Duel.find_by_id(self.duel_id)
if @duel.date < Time.now
redirect_to duel_bets_path(@duel)
end
end[/code]
zmienię później to przekierowanie na jakiś błąd, ale na razie nie mam jeszcze wstawionego wyświetlania błędów. Mógłby ktoś podać mi przykład spreparowanego requestu ? ponieważ nie wiem jak dokładnie on wygląda i nie mogę sprawdzić ;p[/quote]
Walidacje robimy w modelu Bet:

[code=‘ruby’]class Bet < AR::Base

belongs_to :duel

validates :duel_already_started

protected

def duel_already_started
errors.add :duel if duel.starts_at < Time.now.utc
end

end[/code]
W ten sposób Bet nie będzie tworzony jeżeli duel będzie nierozpoczęty.

moja walidacja była w modelu Bet, nie wiedziałem jedynie, że on sam odnajdzie sobie :duel a reszta jest praktycznie tak samo(bety można tworzyć dopóki duel jest nierozpoczęty, kiedy się rozpocznie nie można już ich tworzyć ale znaczek nierówności i tak dobry podałeś ;p), dzięki za pomoc