1

Ich habe eine API-nur Schienen-Anwendung mit active_model_serializers 0.10. Ich habe ein current_user Attribut in meinem ApplicationController und versuche, von meinen Serialisern darauf zuzugreifen, um die gezeigten Daten einzuschränken. Ich kann es tun, indem ich es manuell wie ExerciseSerializer.new(@exercise, scope: current_user) an den Bereich übergebe, möchte aber eine allgemeine Lösung haben. DieseInclude current_user in ActiveModel :: Serializer

ist mein ApplicationController:

class ApplicationController < ActionController::API 
    include Response 
    include ExceptionHandler 

    serialization_scope :view_context 

    # called before every action on controllers 
    before_action :authorize_request 
    attr_reader :current_user 

    def check_access_rights(id) 
    @current_user.id == id 
    end 

    def check_admin_rights 
    if [email protected]_user.admin 
     raise(ExceptionHandler::AuthenticationError, Message.unauthorized) 
    end 
    end 

    private 

    # Check for valid request token and return user 
    def authorize_request 
    @current_user = (AuthorizeApiRequest.new(request.headers).call)[:user] 
    end 

end 

Dies ist einer meiner Serializer:

class ExerciseSerializer < ActiveModel::Serializer 
    attributes :id, :name, :description, :image_url, :note 
    delegate :current_user, :to => :scope 
    has_many :exercise_details 

end 

Und das ist, wie ich die Objekte vorstellen:

def json_response(object, status = :ok) 
    render json: object, status: status 
    end 

Wenn die Serialisierung ich der folgende Fehler:

** Module::DelegationError Exception: ExerciseSerializer#current_user delegated to scope.current_user, but scope is nil: 

Wenn ich versuche, die current_user aus dem Serializer zugreife, erhalte ich folgende Fehlermeldung:

*** NameError Exception: undefined local variable or method `current_user' for #<ExerciseSerializer:0x007ff15cd2e9c0> 

Und natürlich Umfang ist nil.

Irgendwelche Ideen wären hilfreich. Vielen Dank!

Antwort

1

Fand es zufällig nach unzählige Male erfolglos, die offiziellen Dokumente zu lesen: https://www.driftingruby.com/episodes/rails-api-active-model-serializer

So, hier ist der interessante Teil:

def current_user_is_owner 
    scope == object 
end 

So current_user in der scope Variable standardmäßig, Sie don gespeichert Es muss kein Code im Controller hinzugefügt werden, um ihn abzurufen.

Werke in 0,10 und verfügbar seit 0.08: https://github.com/rails-api/active_model_serializers/search?utf8=%E2%9C%93&q=scope&type=

Verwandte Themen