2014-12-22 2 views
0

Есть 2 Пространства имен:Ruby On Rails' не работает, как ожидалось

api/public 
api/mobile 

авторизация Швейцар с правильным объемом создаются в общественном контроллере. Например:

class API::Public::PostsController < ApplicationController 
    before_action -> { doorkeeper_authorize! :public } 

    def show 
    @post = Post.find(params[:id]) 
    end 
end 

Контроллер в пространстве имен мобильной связи наследуется от контроллера в открытом пространстве имен. Например:

class API::Mobile::PostsController < API::Public::PostsController 
    skip_before_action :doorkeeper_authorize! 
    before_action -> { doorkeeper_authorize! :mobile } 
end 

Итак, суть здесь в том, что функциональность одинакова и если есть какая-то разница для мобильных устройств, то действие может быть отменено в мобильном пространстве имен. Проблема в том, что области для разных пространств имен различны, но пропускают doorkeeper_authorize! не работает.

Есть ли способ решить эту проблему?

ответ

3

skip_before_filter работает для пропусков, не пропускает lambdas/procs. Попробуйте создать метод для публичного разрешения:

class API::Public::PostsController < ApplicationController 
    before_action :authorize_public 

    ... 

    def authorize_public 
    doorkeeper_authorize! :public 
    end 
end 

class API::Mobile::PostsController < API::Public::PostsController 
    skip_before_action :authorize_public 
    ... 
end 
+0

Если есть метод before_action, который принимает лямбда/proc, почему нет способа пропустить лямбда/proc? Есть ли ограничение? –

+1

Как бы вы указали, какой лямбда/proc пропустить? У них нет имен. Например, предположим, что есть два 'before_action' lambdas (как и было на самом деле), и оба они называются' doorkeeper_authorize! '. Как вы различаете их? –

+0

Хорошая точка. Как насчет хранения лямбда в переменной? Что-то вроде: 'authorize_public = lambda {doorkeeper_authorize! : public} '? И 'skip_before_action: authorize_public' –

4

Вы можете вызвать метод внутри вашего лямбда, который возвращает то, что санкционировать:

class API::Public::PostsController < ApplicationController 
    before_action -> { doorkeeper_authorize! authorization_scope } 

    def show 
    @post = Post.find(params[:id]) 
    end 

    protected 
    def authorization_scope 
     :public 
    end 
end 

Тогда ваши подклассы нужно только переопределить метод без получения в skip_before_filter pain

class API::Mobile::PostsController < API::Public::PostsController 
    protected 
    def authorization_scope 
     :mobile 
    end 
end 
Смежные вопросы