before_filter с динамической информацией - PullRequest
1 голос
/ 16 сентября 2009

Я пытаюсь добавить фильтр в контроллер, основанный на определенной роли (используя role_requirement), а затем на идентификаторе company_id, который есть у каждого пользователя.

Так что в основном мне нужно что-то вроде этого:

require_role "company" ** This is working fine
  before_filter :company_required

def company_required
  unless current_user.company_id == Company.find(params[:id])    
end 

конец

Ошибка, которую я получаю неопределенный метод `company_id 'для nil: NilClass

Буду признателен за любые рекомендации. Спасибо

Ответы [ 4 ]

2 голосов
/ 10 октября 2009

Если пользователь не вошел в систему, 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.

0 голосов
/ 16 сентября 2009

Не зная ошибки, почти невозможно диагностировать. Вот несколько предложений:

require_role "company" # This is working fine

then before_filter :company_required
def company_required
  unless current_user.company_id == params[:id].to_i #cast to int, to be sure
  redirect_to ('/')
end

Кроме того, убедитесь, что у вас настроен before_filter для фактического получения current_user, в противном случае вы можете получить ошибку вроде:

Ошибка при попытке получить nil.company_id

Если это ошибка, то current_user равен nil, вероятно, потому что он никогда не был установлен.

0 голосов
/ 18 сентября 2009

Я предполагаю, что вы используете RESTful Authentication, потому что вы ссылаетесь на "current_user", и похоже, что это не определено.

Если посмотреть на код этого плагина, он выглядит так, как будто он установлен в модуле AuthenticatedSystem. Я предполагаю, что вы не включили это в свой контроллер.

В соответствии с кодом, который автоматически генерируется для контроллера сессий, вы должны добавить «include AuthenticatedSystem» в свой контроллер приложения (чтобы он был доступен для всех контроллеров).

Вот блок кода сгенерированного контроллера сессий из RESTful Authentication.

# This controller handles the login/logout function of the site.  
class SessionsController < ApplicationController
  # Be sure to include AuthenticationSystem in Application Controller instead
  include AuthenticatedSystem  
0 голосов
/ 16 сентября 2009

Я бы попробовал пару вещей:

  • unless current_user.company == Company.find(params[:id]). Обратите внимание, я звоню компании по объекту current_user, а не company_id. Кроме того, params - это хеш, поэтому вам необходимо получить к нему доступ через [].
  • если только current_user.company_id = params [: id]> / code>. Возможно, это лучше, поскольку мы не обращаемся к базе данных с просьбой найти экземпляр компании.
  • Если ничего из этого не работает, попробуйте использовать отладчик ruby, чтобы увидеть, что возвращается и оценивается в каждой точке.
...