具有动态信息的before_filter

时间:2009-09-16 15:35:51

标签: ruby-on-rails before-filter

我正在尝试将过滤器添加到基于特定角色的控制器(使用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 个答案:

答案 0 :(得分:2)

如果用户未登录,则current_user将为nil。你必须防范这种情况。这里也缺少一些东西。无论过滤器调用的方法返回什么,操作都将始终继续。除了在过滤器中调用渲染或重定向的方法之外。

这是一个工作过滤器,可以执行您要执行的操作,假设您有一个名为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以更好地了解登录过程会很有帮助。简短版本是用户将提交表单作为应用程序成员的表单提交到设置current_user的sessions_controller。如果你运行了生成器,你应该访问上面提到的logged_in?方法

sessions_controller和current_user在你的应用程序中可能是不同的,你给了Restful Authentication生成器的不同参数。

答案 1 :(得分:0)

我会尝试一些事情:

  • unless current_user.company == Company.find(params[:id])。注意我在current_user对象上调用公司,而不是company_id。此外,params是一个哈希值,所以你需要通过[]。
  • 访问它
  • 除非current_user.company_id = params [:id]> / code>。可以说这更好,因为我们没有向数据库发出请求以查找公司实例。
  • 如果不可行,请尝试使用ruby-debugger查看每个点返回和评估的内容。

答案 2 :(得分: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为nil,可能是因为它从未设置过。

答案 3 :(得分:0)

我假设您正在使用RESTful身份验证,因为您正在引用“current_user”,看起来它没有被定义。

在查看该插件的代码时,它看起来像是在AuthenticatedSystem模块中设置的。我的猜测是你没有把它包含在你的控制器中。

根据为会话控制器自动生成的代码,您应该在应用程序控制器中添加“include AuthenticatedSystem”(因此它可供所有控制器使用)。

以下是来自RESTful身份验证的生成会话控制器的代码块。

# This controller handles the login/logout function of the site.  
class SessionsController < ApplicationController
  # Be sure to include AuthenticationSystem in Application Controller instead
  include AuthenticatedSystem