2017-10-04 4 views
1

Recherche d'une requête asynchrone à partir d'un composant React. Cependant, il échoue toujours en raison d'autorisations non valides.Aucun utilisateur dans CanCanCan ability.rb

Exemple demande de travail:

Started GET "/" for 127.0.0.1 at 2017-10-04 16:32:00 -0400 
Processing by EventsController#index as HTML 
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] 
    Rendering events/index.html.erb within layouts/application 

Exemple ne demande async:

Started GET "/events/search?ne_lat=37.82915414554321&ne_lng=-122.13221051635742&sw_lat=37.72060601151162&sw_lng=-122.70658948364257" for 127.0.0.1 at 2017-10-04 16:32:07 -0400 
Processing by EventsController#search as */* 
    Parameters: {"ne_lat"=>"37.82915414554321", "ne_lng"=>"-122.13221051635742", "sw_lat"=>"37.72060601151162", "sw_lng"=>"-122.70658948364257"} 
    ... #NOTE: printing 'user' from byebug in ability.rb shows it as nil 
CanCan::AccessDenied (You are not authorized to access this page.): 

Notez que la demande ne ne sélectionne pas/charger l'utilisateur d'une requête DB. Des idées sur ce qui pourrait mal tourner? Les autorisations Ability.rb autorisent cette requête, mais l'utilisateur n'est pas correctement renseigné lors d'un appel asynchrone.

Cette requête fonctionnait précédemment en utilisant jQuery mais je l'ai réécrit en utilisant fetch.

Voici le contrôleur

class EventsController < ApplicationController 
    before_action :set_event, only: [:show, :edit, :update, :destroy] 
    load_and_authorize_resource 

    def index 
    @events = Event.all 
    end 
    ... 
    def search 
    local_events = Event.includes(:address).references(:address) 
     .where("latitude >= ? AND latitude <= ? AND longitude >= ? AND longitude <= ?",  
      params[:sw_lat], params[:ne_lat], params[:sw_lng], params[:ne_lng] 
     ) 
     .limit(50) 

    render json: local_events, only: [:id,:name,:description,:start], include: { address: { only: [:latitude,:longitude,:street_address] }} 
    end 

end 

Et le ability.rb

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    can :read, :all 
    byebug 
    return if user == nil #user must be logged in after this point 

    #events 
    can [:search], Event 
    ... 
    end 
end 
+0

Afficher 'EventsController' – chumakoff

+0

Terminé. Tout ce que vous recommandez d'ajouter? –

Répondre

2

La requête asynchrone n'interroge pas l'utilisateur de DB parce qu'il n'y a pas d'ID utilisateur dans la session. Il n'y a pas d'ID utilisateur dans la session, car le fetch n'inclut pas les cookies par défaut.

Pour envoyer des cookies avec Fetch Demander le credentials option "same-origin" ou "include":

fetch(url, { 
    credentials: 'include' 
}) 

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Sending_a_request_with_credentials_included

+0

Incroyable merci! J'ai décidé d'utiliser 'same-origin' au lieu de' include'. Quand auriez-vous des informations d'identification sur un site étranger? Quel type de cas d'utilisation requiert 'include' - lorsqu'un utilisateur dispose d'informations d'identification spéciales et qu'il ne s'agit pas d'une clé API? –

+1

Je ne suis pas sûr de pouvoir donner une réponse qualifiée à votre question. C'est un bon candidat pour une nouvelle question sur StackOverflow. Bonne chance! – chumakoff