假设require_role ["alt", "student worker"], :except => [:list, :show, :index, :create]
在此方法之外工作,我在这里做错了什么?当我调用方法时,它是promo_site吗? (true),但是当它为false时,方法失败。
def check_if_role_is_required
require_role ["alt", "student worker"], :except => [:list, :show, :index, :create] unless promo_site?
end
答案 0 :(得分:1)
含糊不清的问题,所以这只是猜测:
一眼就看出,require_role是before_filter的包装器。所以我将根据这一观点得出答案。
before_filter是一个控制器类方法。与check_if_role_required相反,后者似乎是一个控制器实例方法。因为require_role似乎是before_filter的包装器,所以我将假设它也是一个类方法。
当你调用一个裸方法(不是由对象调用)时,Ruby会隐式地将调用对象确定为self。这可能是出现在方法外部的方法调用的定义类,或者是在其他方法内调用当前方法进行方法调用的对象。在类方法的情况下,self是当前类。当谈到before_filter时,它期望被ActionController :: Base类调用。通过在一个实例方法(如check_if_role_required)中调用它,self会计算一个ActionController :: Base的实例,该实例没有before_filter,甚至可能还没有定义require_role。
代码总是有助于巩固例子:
这个简单的课程有助于说明我的观点。
class Example
# class method like required_role or before_filter
def self.c_method
# calls self.class
# self is the class Example
class
end
c_method # valid statement
#instance method like check_if_role_required
def i_method
#calls self.class
# self is an instance of the Example class.
class
end
# invalid statement
# i.method
def missing_method_example
# raises error.
# calls self.c_method, but self is the instance.
# c_method is not defined for instances of Example
c_method
end
end
Example.c_method # => "Class"
@example = Example.new
@example.i_method # => "Example"
@example.missing_method_example # => Unknown Method Error
答案 1 :(得分:0)
尝试将参数包装在括号中:
require_role(["alt", "student worker"], :except => [:list, :show, :index, :create]) unless promo_site?
这通常可以解决涉及哈希问题的问题......