2013-09-16 2 views
0

У меня есть модель пользователя, созданная Devise. Итак, перед фильтром authenticate_user.пользовательский фильтр - где писать этот код?

Я использовал STI и создал еще 2 модели пользователя UserA < User, UserB < Пользователь.

У пользователя есть поле 'type', которое определяет, имеет ли пользовательский объект тип 'UserA' или 'UserB'.

У меня есть некоторые контроллеры, в которых я хочу, чтобы определенный фильтр, например, можно было увидеть только по типу пользователя UserA или UserB. Итак, я хочу, чтобы написать фильтр, как это:

def authenticate_usera 
    if current_user.type == 'usera' 
     return true 
    else 
     return false 
end 

def authenticate_userb 
    if current_user.type == 'userb' 
     return true 
    else 
     return false 
end 

Вопрос:
Так, где я должен поставить этот фильтр код? И, могу ли я использовать это в контроллере:
before_filter: authenticate_usera

Кроме того, нужно ли использовать что-либо вроде «require» для того, чтобы этот фильтр был доступен в этом случае?

+0

'current_user.type == 'usera'' должен быть методом в вашей модели пользователя – apneadiving

+0

спасибо за это. Это прекрасно с этим, что ответ? То, что мы пишем в фильтре, - это другая проблема, я хочу знать, как настраивать аутентификацию или фильтр-контроллер. – user2139745

+0

Это довольно насыщенная зависимость. Чего хочет ваш контроллер? Он хочет знать, может ли current_user получить доступ к чему-то. Он не должен знать о типе пользователя или что-то еще. Например. current_user.can? (: access, an_object) и который вернет, сможет ли пользователь выполнить это действие. Например. модель User должна заботиться об этом, а не о контроллере. Проверьте cancan: https://github.com/ryanb/cancan – Senjai

ответ

0

В вашем ApplicationController добавить следующую функцию:

def only_allowed_for(user_type_class) 
    unless current_user.is_a?(user_type_class) 
    redirect_to root_path, :notice => 'Access to the page is not allowed' 
    end 
end 

В моем тесте я предполагаю, что через STI текущий пользователь будет иметь правильный класс. Я не совсем уверен в этом (это может зависеть от того, как разработчик создает пользователя). Но вы получите картину.

Затем, в любом контроллере, вы можете написать следующее:

class PostsController < ApplicationController 

    before_filter :authenticate_user! 
    before_filter { |c| c.only_allowed_for(UserA) } 

end 

Как вы можете сказать: вы можете редактировать, для которых класс разрешен доступ. И это перенаправит root, если доступ запрещен.

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