Frage

Angesichts der Tatsache, dass es gut dokumentiert ist, wie man vorhat vor_filter für eine einzelne Benutzerklassifizierung verwendet, habe ich Probleme mit dem Schutz von Aktionsebene für mehrere Benutzertypen. Lassen Sie mich erklären:

Ich habe so etwas ...

class ApplicationController < ActionController::Base
  class << self 
    attr_accessor :standard_actions
  end
  @standard_actions = [:index, :show, :new, :edit, :create, :update, :destroy]

  def require_guardian
    unless current_user and current_user.is_a?(Guardian)
      store_location
      redirect_to home_url
      return false
    end
  end

  def require_admin
    unless current_user and current_user.is_a?(Administrator)
      store_location
      redirect_to register_url
      return false
    end
  end
end

Und im GuardiansController möchte ich nur die Standardaktionen für den Administrator zulassen, aber alle anderen Aktionen sollten Guardian erfordern. Also habe ich es versucht ...

class GuardiansController < ApplicationController
  before_filter :require_admin, :only => ApplicationController::standard_actions
  before_filter :require_guardian, :except => ApplicationController::standard_actions
  ...
end

Was letztendlich eine rekursive Umleitung durchführt. Es muss einen besseren Weg geben?

War es hilfreich?

Lösung

OK, dies ist ein weiterer Fall, in dem es nicht sorgfältig schaut und etwas fehlt. Ich hatte versehentlich die Route eingerichtet, um den Benutzer auf rekursive Weise umzuleiten. Die obige Lösung funktioniert gut, wenn Sie die Routen richtig einstellen:

def require_guardian
  unless current_user and current_user.is_a?(Guardian)
    store_location
    # this route (home_url) sent the user to another controller which ran a before_filter sending them back here again.
    # redirect_to home_url 
    # So I changed it to a neutral route and it works great!
    redirect_to register_url
    return false
  end
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top