Если пользователь не вошел в систему, current_user будет ноль. Вам придется остерегаться этого случая. Здесь также чего-то не хватает. Независимо от того, что возвращает метод, вызванный фильтром, действие всегда будет продолжаться. За исключением метода, который вызывает render или redirect в фильтре.
Вот рабочий фильтр, который делает то, что вы пытаетесь сделать, при условии, что у вас есть именованный маршрут с именем denied.
require_role "company" ** This is working fine
before_filter :company_required
def company_required
redirect_to denied_url unless logged_in? && current_user.company_id == Company.find(params[:id])
end
Вы можете добавить маршрут, добавив следующее в config / rout.rb перед блоком маршрута по умолчанию. Вы можете использовать существующий контроллер или создать новый, если хотите. Это то, что я обычно использую:
map.denied '/denied', :controller => "home", :action => "denied"
Как уже говорили другие, похоже, что вы используете Restful Authentication. Возможно, вам будет полезно взглянуть на документацию , чтобы лучше понять процесс входа в систему. Короткая версия состоит в том, что пользователь отправит форму, идентифицирующую их как члена вашего приложения, для session_controller, который устанавливает current_user. Если вы запустили генератор, вы должны получить доступ к вышеупомянутому logged_in? способ.
session_controller и current_user могут отличаться в вашем приложении, если вы задали разные аргументы генератора Restful Authentication.