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.

1
jpw 30 wrzesień 2012, 07:16

2 odpowiedzi

Najlepsza odpowiedź

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.

4
mu is too short 30 wrzesień 2012, 07:35

Możesz mieć filtr przed, aby sprawdzić własność i renderować lub przekierowywać bazę na czeku

1
Yuriy Goldshtrakh 30 wrzesień 2012, 07:34