Jeden z moich kontrolerów ma blisko 100 metod (np. tras) i prawie każdy uruchamia ten sam kod, aby przekierować do strony błędu, jeśli parametr identyfikatora jest nieprawidłowy, a następnie podobne sprawdzenie, czy użytkownik, którego identyfikator nie należy do konto użytkownika:
def something
@foo = Foo.find_by_guid(params[:id])
unless @foo
@msg ||= { :title => 'No such page!',
:desc => "There is no such page!" }
render :action => "error" and return
end
unless @foo.owner_id == current_user.id
@msg ||= { :title => 'Really?',
:desc => "There is no such page." }
render :action => "error" and return
end
Jaki jest najlepszy sposób na wysuszenie tego rodzaju walidacji identyfikatora strony i identyfikatora właściciela, biorąc pod uwagę, że kod wykonuje renderowanie ... i zwraca?
To, czego nie chcę w tym momencie robić, to przenosić go do biblioteki ról i uprawnień czarnej skrzynki, takiej jak CanCan ... moim celem jest po prostu, aby kod w aplikacji do obsługi tego był tak czysty, jak to możliwe.
2 odpowiedzi
Wygląda na to, że potrzebujesz filtra przed:
class MegaController < ActionController::Base
before_filter :grab_and_check_foo
#...
private
def grab_and_check_foo
@foo = Foo.find_by_guid(params[:id])
if !@foo
#... render some error stuff
end
if @foo.owner_id != current_user.id
#... render some other error stuff
end
end
end
filtr przed może wyrwać się ze zwykłego procesu kontrolera, przekierowując lub renderując coś tak, żaden problem.
Możesz mieć filtr przed, aby sprawdzić własność i renderować lub przekierowywać bazę na czeku
Podobne pytania
Nowe pytania
ruby-on-rails
Ruby on Rails to framework aplikacji internetowych typu open source z pełnym stosem, napisany w języku Ruby. Opiera się na popularnym modelu frameworkowym MVC i jest znany ze swojego podejścia do tworzenia aplikacji „konwencja zamiast konfiguracji”.