2015-08-10 11 views
1

Я использую Cancan, чтобы гарантировать, что только пользователи с разрешениями могут удалять объекты в моем приложении Rails. У меня есть мобильное приложение-компаньон, которое отправляет запросы на удаление с помощью auth_token пользователя. Вот как выглядит запрос:Способность к канкану не найти пользователя

Started DELETE "/projects/888?auth_token=ArpuyxbDyjtyn67r3JgF" 
Processing by ProjectsController#destroy as */* 
Parameters: {"auth_token"=>"ArpuyxbDyjtyn67r3JgF", "id"=>"888", "project"=>{}} 

Но я получаю, что пользователь несанкционирован.

Это то, что я положил в мой контроллер:

class ProjectsController < ApplicationController 
def destroy 
    @project = Project.find(params[:id]) 
    if params[:auth_token] 
     current_user = User.where(:authentication_token => params[:auth_token]).first 
    end 

    authorize! :destroy, @project 
    @project.destroy 
    respond_to do |format| 
     format.html{ redirect_to user_path(current_user.username) } 
     format.json { head :no_content} 
    end  
    end 
end 

И это мой ability.rb файл:

class Ability 
    include CanCan::Ability 

    def initialize(user) 

    user ||= User.new 

    can :destroy, Project do |project| 
     project.user == user || (user && user.admin?) 
    end 
end 

Проверка моей базы данных, правильный auth_token в настоящее время передается для пользователя.

Как заставить пользователя cancan соответствовать пользователю с переданным параметром auth_token, чтобы он мог удовлетворять разрешениям способности?

+1

не должно быть 'user || = User.new'? – Levsero

+0

@ Levsero спасибо, ты прав. к сожалению, это принципиально не решило проблему, о которой я рассказывал. – scientiffic

ответ

0

Я думаю, что проблема заключается в том, что вы устанавливаете локальную переменную current_user, а не метод контроллера, который находит и возвращает текущего пользователя. Cancan ищет метод контроллера для поиска current_user.

+0

Я думал, что приложение сможет автоматически определить текущего пользователя с прошедшим аутентификационным токеном - это проблема, которую я должен решить с помощью разработки или с cancan? – scientiffic

+0

Просто убедитесь, что вы на самом деле подписываете пользователя с помощью устройства, его следует исправить, если это проблема. – Levsero