2014-02-12 3 views
1

В рельсах у меня есть базовый контроллер, который определяет http_basic_authentication_with, и я хотел бы, чтобы у вас был конкретный маршрут, пропущенный в подклассе. Это будет похоже на то, как я могу указать контроллер skip_before_filter. Это возможно?Пропустить http_basic_authentication_with для определенного маршрута

Мой базовый контроллер выглядит примерно так:

class BaseController < ApplicationController 
    http_basic_authenticate_with name: "name", password: "password" 
end 

И у меня есть контроллер, который наследуется от:

class HomeController < BaseController 
    def index 
    end 

    def no_auth 
    end 
end 

Я хотел бы так, что «индекс» требует базовой аутентификации, но «no_auth» этого не делает.

Спасибо!

+0

Вы хотите просто показать небольшой код? –

+0

Извините, я не думал, что код будет полезен, но на всякий случай, я добавил некоторые. – drewag

ответ

1

Вот как я это сделаю.

class BaseController < ApplicationController 
    http_basic_authenticate_with name: "name", password: "password" 
end 

Давайте заменим http_basic_authenticate_with нашего собственного метода класса. Назовем это auth_setup.

class BaseController < ApplicationController 
    auth_setup 

    def self.auth_setup 
    http_basic_authenticate_with name: "name", password: "password" 
    end 
end 

Поскольку мы не хотим называть его в каждом подклассе, мы можем извлечь только параметры для другого метода. Назовем его auth_params.

class BaseController < ApplicationController 
    auth_setup 

    def self.auth_setup 
    http_basic_authenticate_with auth_params 
    end 

    def self.auth_params 
    { name: 'name', password: 'password' } 
    end 
end 

С этого момента мы можем использовать этот метод для изменения параметров auth в наших подклассах. Например:

class HomeController < BaseController  
    def index 
    end 

    def no_auth 
    end 

    def self.auth_params 
    (super).merge(except: :index) 
    end 
end 

Однако вызовы методов в определениях классов Ruby, не наследуются (это легко забыть с Rails стиль вещей). В зависимости от реализации http_basic_authenticate_with вам понадобится другое исправление - обратный вызов inherited.

class BaseController < ApplicationController 
    auth_setup 

    def self.auth_setup 
    http_basic_authenticate_with auth_params 
    end 

    def self.auth_params 
    { name: 'name', password: 'password' } 
    end 

    def self.inherited(subclass) 
    subclass.auth_setup 
    end 
end 

Надеюсь, это поможет!

+0

К сожалению, это не работает для меня, потому что я пытаюсь выполнить «исключение» для маршрута, который находится в подклассе. (Http_basic_authenticate_with определяется в отдельном контроллере, чем где я хочу добавить «except») – drewag

+0

Вы пытались поместить этот код в подкласс? – marvelousNinja

+0

Я не хочу переопределять базовый auth. Это будет означать несколько мест для поддержки базового имени пользователя и пароля. – drewag

Смежные вопросы