简单的ruby,除非方法错误,ROR

时间:2010-02-12 05:24:48

标签: ruby-on-rails ruby

假设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

2 个答案:

答案 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?

这通常可以解决涉及哈希问题的问题......