如何在rails 4中的类中调用模块中定义的方法

时间:2014-08-06 11:45:37

标签: ruby-on-rails ruby datagrid devise module

我的代码:

我仅在AuthenticationRelated使用了ApplicationHelper signed_in?中的is_admin?来自Devise Gem。

module AuthenticationRelated
 def is_admin?
    athu = false
    if signed_in?
      current_user.roles.each do |role|
        if role.name == 'admin'
          athu = true
        end
      end
    end
    athu
  end
end

现在我有一个课程SalesReportsGrid,我需要能够访问is_admin? 所以这就是我所做的:

class SalesReportsGrid

  include Datagrid
  include AuthenticationRelated

  scope do
    if is_admin?
      Sales.joins(product: [ category: [:access_lists] ] )
    else
     ....
    end
  end
....
end

现在,当我运行此操作时,我收到以下错误:

undefined method `is_admin?` for SalesReportsGrid:Class

修改

当我添加extend AuthenticationRelated

这就是我得到的:

undefined method `signed_in?` for SalesReportsGrid:Class

我真的很困惑,有人可以看看并提出建议吗? 感谢

2 个答案:

答案 0 :(得分:1)

如果是include模块,则将其方法添加到使用include的类的实例中。制作模块方法'类方法' (即类的单例方法),你应该使用extend

extend AuthenticationRelated

答案 1 :(得分:0)

您需要明确使用current_user来定义网格范围。

以下是示例:

def index
  @grid = SalesReportGrid.new(params[:sales_report_grid]) do |scope|
    unless current_user.admin?
      scope.where_accessible_by(current_user)
    end
  end
end

它允许您更明确,不要将访问控制移动到网格,并将其保留在控制器中,就像在其他地方一样。