我正在尝试将过滤器添加到基于特定角色的控制器(使用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
我很感激任何指导。感谢
答案 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是一个哈希值,所以你需要通过[]。答案 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