2009-09-16 2 views
1

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

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

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» для ноль: NilClass

Я был бы признателен за любые указания. Благодаря

+1

Какая ошибка? Также в вашем примере кода есть синтаксическая ошибка, можете ли вы исправить это? –

+0

Итак, теперь я понял, что мне нужно использовать current_user.company.id для вызова правильного идентификатора. Или, по крайней мере, вызов этого в любом представлении работает. Но теперь это всегда позволяет мне пройти. Ошибок нет. Я жестко закодировал его, чтобы сказать current_user.company.id == '1', пока я просто попытаюсь заставить его работать. Любые идеи? – 2009-09-17 03:39:46

+0

Проблема заключается в том, что вы сравниваете идентификатор с объектом компании Вы должны сделать это current_user.company_id == Company.find (PARAMS [: идентификатор]). ID – nasmorn

ответ

0

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

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

Жаль, что я сделал ужасную работу кладя этот код: before_filter: company_required защиту company_required если current_user.company_id == Company.find (PARAMS [: идентификатор]) конец конец ошибки я получаю это: неопределенный метод 'company_id» для ноля: NilClass (то же самое для компании как объект) Я не думаю, что я звоню current_user. Я новичок, поэтому я не уверен, что я делаю неправильно. Я ценю любая помощь. – 2009-09-16 20:16:16

+0

После редактирования исходного сообщения ясно, что проблема связана с current_user, что равно нулю. Вы в основном вызываете модельный метод на nil, что не совсем работает. Вам не хватает файла before_filter, который устанавливает current_user. Пройдите через документы в любой системе проверки подлинности, используемой вами, чтобы настроить это (authlogic, оформление и т. Д.). – hgmnz

0

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

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 равен нулю, вероятно, потому, что он никогда не был установлен.

0

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

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

В соответствии с кодом, который автоматически генерируется для контроллера сеансов, вы должны добавить «включить 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 
2

Если пользователь не вошел в систему, current_user будет равен нулю. Вам придется защититься от этого дела. Здесь тоже что-то не хватает. Независимо от того, что возвращает метод, вызванный фильтром, действие всегда будет продолжаться. За исключением метода, который вызывает рендеринг или перенаправление в фильтр.

Вот рабочий фильтр, который делает то, что вы пытаетесь сделать, если у вас есть именованный маршрут с именем 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/routes.rb перед блоком маршрута по умолчанию. Вы можете использовать существующий контроллер или создать новый, если хотите. Это то, что я обычно использую:

map.denied '/denied', :controller => "home", :action => "denied" 

Как утверждают другие, похоже, что вы используете Restful Authentication. Возможно, вам будет полезно взглянуть на documentation, чтобы лучше понять процесс входа в систему. Краткая версия заключается в том, что пользователь отправит форму, идентифицирующую их как член вашего приложения, в session_controller, который устанавливает current_user. Если вы запустили генератор, вы должны получить доступ к указанному выше logged_in? метод.

session_controller и current_user могут быть чем-то другим в вашем приложении, так что вы дали аргументы Resten Authentication differenet.

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

  • Нет связанных вопросов^_^