Szybka weryfikacja czyli różne redirect_to do różnych linków

Cześć,
Chcę aby po kliknięciu w Fast Verification, a następnie Verify przekierowanie było do ostatniego niezweryfikowanego ogłoszenia
Coś źle kombinuję strasznie.
Za dużo poniżej powtórzeń jest. Może jakoś za pomocą parametru.
To co poniżej działa ale jak to zrobić porządnie?

[code=ruby]#verifications/index.haml

  • if Ad.unverified_ads.size == 0
  • else
    = link_to “Szybka Weryfikacja”, fast_verify_info_verification_path(Ad.unverified_ads.last), :method => :put
    = link_to “Normal Verify”, verify_info_verification_path(ad), :method => :put

#verifications/verify_info.haml
= link_to “Verify”, verify_verification_path(@ad)
#verifications/fast_verify_info.haml
= link_to “Weryfikuj”, fast_verify_verification_path(Ad.unverified_ads.last), :method => :put
#verification_controller.rb
def verify_info
@ad = Ad.find(params[:id])
end
def fast_verify_info
@ad = Ad.find(params[:id])
end

def fast_verify
@ad = Ad.find(params[:id])
@ad.verify!
if Ad.unverified_ads.size == 0
redirect_to verifications_path
else
redirect_to fast_verify_info_verification_path(Ad.unverified_ads.last)
end
end
def verify
@ad = Ad.find(params[:id])
@ad.verify!
if params[:fast] == true
redirect_to Ad.unverified_ads.last
else
redirect_to verifications_path
end
end[/code]

Tak na pierwszy rzut oka można:

[code=ruby]#verifications/index.haml

  • unless Ad.unverified_ads.empty?
    = link_to “Szybka Weryfikacja”, fast_verify_info_verification_path(Ad.unverified_ads.last), :method => :put
    = link_to “Normal Verify”, verify_info_verification_path(ad), :method => :put

#verifications/verify_info.haml
= link_to “Verify”, verify_verification_path(@ad)
#verifications/fast_verify_info.haml
= link_to “Weryfikuj”, fast_verify_verification_path(Ad.unverified_ads.last), :method => :put

#verification_controller.rb
before_filter :load_ad
before_filter :verify_ad, :only => [:fast_verify, :verify]

def verify_info
end

def fast_verify_info
end

def fast_verify
if Ad.unverified_ads.empty?
redirect_to verifications_path
else
redirect_to fast_verify_info_verification_path(Ad.unverified_ads.last)
end
end

def verify
redirect_to params[:fast] == true ? Ad.unverified_ads.last : verifications_path
end

private

def load_ad
@ad = Ad.find(params[:id])
end

def verify_ad
@ad.verify!
end[/code]
Poza tym zastanowiłbym się, czy nie warto zamknąć Ad.unverified_ads.last
w jakiejs metodzie w modelu i dać tam order explicite.

Tak samo “Ad.unverified_ads.empty?” należałoby do jakiejś metody wpakować, używasz tego w przynajmniej 2 miejscach

Fakt, nie zauważyłem nawet tego jak na szybko przepisywałem ;]

[quote=sarniak]Poza tym zastanowiłbym się, czy nie warto zamknąć Ad.unverified_ads.last
w jakiejs metodzie w modelu i dać tam order explicite.[/quote]
Przepraszam ale zapytam, po co zamykać to w modelu?
Będzie to wyglądać tak?

[code=ruby]class Ad
def self.last_unverified
self.unverified_ads.last
end
end

w widoku i kontrolerze

Ad.last_unverified[/code]
Dlaczego tak zrobić?

Poza tym dostaje błąd przy metodzie load_ad, przy before_fileter powinien być chyba wyjątek dla :index

Poprawki tutaj => https://gist.github.com/1643261

Z góry zastrzegam, że nie do końca odpowiadam na zadane pytanie :slight_smile: : http://blog.robert.pankowecki.pl/2012/01/model-logic.html

W tym wypadku ma to niewielką różnicę, ale ja wolę takie rzeczy zamykać, żeby po pierwsze nie mieć zbyt długiego łańcucha, a po drugie, co ważniejsze, piszę do czegoś takiego test i jak ktoś potem zmieni coś w stylu dodanie orderu itp. to test mi wtedy to wyłapie. Za to jak zostawisz to w kontrolerze i później coś zmienisz, to nie ma na to szans. Nie znam aplikacji, może tu nie ma takiego zagrożenia.

Pisałem na podstawie kodu, który wkleiłeś, nie jestem jasnowidzem :slight_smile:

[code=ruby]- unless @unconfirmed_ads.empty? # którą wersję wybrać?

  • unless Ad.unconfirmed_empty? # metoda w modelu - Tak miałem do tej pory, wg wskazówek :slight_smile:

= link_to “Szybka Weryfikacja”, verification_path(@last_unverified_ad), :method => :put
= link_to “Ogłoszenia do zweryfikowania”, verifications_path(:scope => “unverified_ads”)
[
= @unverified_count # tak wydaje się nienajlepszą opcją
]
= link_to “Ogłoszenia potwierdzone”, verifications_path(:scope => “confirmed_ads”)
[
= @unconfirmed_ads.count # tak chyba lepiej
]

  • @ads.each do |ad|

kontroler

class VerificationsController < ApplicationController
before_filter :load_ad, :except => [:index]

def index
@ads = Ad.with_some_scope(params[:scope], params[:email])
@last_unverified_ad = Ad.last_unverified
@unverified_count = Ad.unverified_ads.count
@unconfirmed_ads = Ad.unconfirmed_ads
end

private

def load_ad
@ad = Ad.find(params[:id])
@last_unverified_ad = Ad.last_unverified
end
end[/code]