基本上我想实现一个简单的Rails延伸以限定在我的控制器的方法的严重性,这样我可以适当地限制它们的使用。例如我限定在一个抽象超默认宁静操作为这样:

view_methods :index, :show
edit_methods :new, :create, :edit, :update
destroy_methods :destroy

我想然后在非抽象控制器呼叫向下:

edit_methods :sort

要在排序方法,其特定的控制器上添加作为一个编辑水平的方法。

我可以然后使用的before_filter来检查当前执行的动作的水平,并且如果我的逻辑确定当前用户不能做到这一点终止它。

麻烦的是,我无法工作了如何建立这种结构。我已经试过这样的事情至今:

class ApplicationController

  @@view_methods = Array.new
  @@edit_methods = Array.new
  @@destroy_methods = Array.new

  def self.view_methods(*view_methods)
    class_variable_set(:@@view_methods, class_variable_get(:@@view_methods) << view_methods.to_a)
  end

  def self.edit_methods(*edit_methods)
    class_variable_set(:@@edit_methods, self.class_variable_get(:@@edit_methods) << edit_methods.to_a)
  end

  def self.destroy_methods(*destroy_methods)
    @@destroy_methods << destroy_methods.to_a
  end

  def self.testing
    return @@edit_methods
  end


  view_methods :index, :show
  edit_methods :new, :create, :edit, :update
  destroy_methods :destroy

end
上述

这三种方法都在不同的目的,只是为了告诉你什么是我试过。第三个工作,但不管我考什么控制器返回相同的结果。可能是因为类变量被存储在应用控制器,以便在全球范围内发生变化。

任何帮助,将不胜感激。

其他提示

我把它变成一个插件,像这样:

module ThreatLevel

  def self.included(base)
    base.send :extend, ClassMethods
  end

  module ClassMethods
    def roger_that!
      class_inheritable_array :view_method_list, :edit_method_list, :destroy_method_list

      self.view_method_list = Array.new
      self.edit_method_list = Array.new
      self.destroy_method_list = Array.new

      def self.view_methods(*view_methods)
        self.view_method_list = view_methods
      end

      def self.edit_methods(*edit_methods)
        self.edit_method_list = edit_methods
      end

      def self.destroy_methods(*destroy_methods)
        self.destroy_method_list = destroy_methods
      end

      view_methods :index, :show
      edit_methods :new, :create, :edit, :update
      destroy_methods :destroy
    end
  end
end

ActionController::Base.send :include, ThreatLevel

电话roger_that!你想上哪儿就生效super_controller是卓有成效的。

scroll top