[code=ruby]#kontroler
def index
# @ads = Ad.where(“advertiser_id IS NOT NULL AND verification_date IS NOT NULL”) @ads = Ad.send(params[:scope] : ‘unverified_ads’)
end #widok
link_to “Ogłoszenia niepotwierdzone”, verification_path(:scope => “unconfirmed_ads”) #model
scope :unconfirmed_ads, :conditions => [“advertiser_id IS NULL”]
scope :unverified_ads, :conditions => [“advertiser_id IS NOT NULL AND verification_date IS NOT NULL”][/code]
ale dostaję błąd:
syntax error, unexpected ‘:’, expecting ‘)’ @ads = Ad.send(params[:scope] : ‘unverified_ads’)
Rozumiem, że powinienem dodać jakieś routes albo akcje do kontrolera?
nie jest poprawną konstrukcją języka Ruby. Prawdopodobnie chodzi o Ad.send(params[:scope], costam_jako_parametr).
Tak czy inaczej: nie rób tego. Nie chcesz aby użytkownik mógł wysłać dowolną wiadomość do obiektu kasy. Pomyśl o tym co się stanie jeśli w params[:scope] będzie “delete_all”.
Nie no bez jaj - nawet w panelu admina przekazywanie czegoś bez walidacji do send to dla mnie porażka.
Zrób metodę, która akceptuje to samo, ale pozwala na wywołanie tylko zdefiniowanych scopów ogranicza, np.
[code=ruby]Ad.with_some_scope(params[:scope],…)
i definicja w klasie Ad
SCOPES = [“unconfirmed_ads”,“unverified_ads”]
def with_some_scope(scope_name,…)
raise “Invalid scope #{scope_name}” unless SCOPES.include?(scope_name)
end[/code]
Oczywiście to tylko szkic - w realnej implementacji lepiej byłoby się pozbyć stałej SCOPES.
[quote=zlw]Nie lepiej takie sprawdzenie dać w constraints w routes-ach?
Jeżeli ktoś wpisze na produkcji jakiś dziwny url zamiast 500 dostanie 404 (które jakoś bardziej mi tu pasuje)[/quote]
Ostrożności nigdy za wiele - oczywiście dodanie constrainta w routach też jest na miejscu, ale wywoływanie metody na podstawie params, to proszenie się o kłopoty.
Co do błędu 500 - oczywiście w kontrolerze lub gdzieś indziej można dodać rescue - to jest tylko szkic rozwiązania.
def index
@ads = case params[:scope]
when 'unverified_ads'
Ad.unverified_ads
when 'unconfirmed_ads'
Ad.unconfirmed_ads
else
#domyslny scope
Ad.unverified_ads
end
end
A params[:scope] to taki sam parametr jak np. params[:page].
Cześć,
Chcę aby po kliknięciu w Fast Verification, a następnie Verify aby redirect_to było do verify_info_verification_path(Ad.unverified_ads.last, :fast => true)
Coś źle kombinuję strasznie.