2017-10-04 2 views
1

Reactコンポーネントから非同期リクエストを取得しようとしました。ただし、無効な権限のために常に失敗します。CanCanCanのユーザーがいませんability.rb

例作動要求:

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 

例失敗非同期要求:失敗した要求がDB照会からユーザをロード/選択しないこと

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.): 

注意。何が間違っている可能性がある任意のアイデア? Ability.rbアクセス許可はこの要求を許可しますが、ユーザーは非同期に呼び出すときに正しく入力されていません。

このリクエストは以前jQueryを使用していましたが、fetchを使用して書き直しました。ここで

は、セッション中にユーザーIDが存在しないため、非同期リクエストがDBからユーザーを照会しないコントローラ

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 

そして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

ショー 'EventsController' – chumakoff

+0

が完了:フェッチ要求にクッキーを送信するために

"same-origin"または"include"からcredentialsオプションを設定します。他に追加することをお勧めしますか? –

答えて

2

です。 Fetch APIfetchにはデフォルトでCookieが含まれていないため、セッションにユーザーIDはありません。

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

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

+0

すばらしいありがとう!私は 'include'の代わりに' same-origin'を使うことにしました。いつあなたは外国のサイトへの資格を持っていますか?どのような種類のユースケースに 'include'が必要です - ユーザーが特別な資格情報を持っていてAPIキーでないとき? –

+1

私はあなたの質問に適格な答えを与えることができるか分からない。 StackOverflowに関する新しい質問の良い候補です。がんばろう! – chumakoff

関連する問題