在rails 4中创建自定义可重用方法

时间:2014-12-09 15:08:32

标签: ruby-on-rails

今天的家伙我正在尝试为rails 4中的所有项目模型创建全局方法

我在此路径lib/query.rb

下创建了类似的内容
module Query

  def custom my_query
    self.where(my_query)
  end

end

然后在此文件lib/application.rb中添加此代码,以允许rails在此路径下加载文件

# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)

然后使用此命令将我的方法包含在我的模型中

include Query

现在应该准备好使用我的自定义方法,但当我试图在控制器中调用我的方法时

def index
   @users= Users.custom(params[:query])
end

我收到了错误

undefined method `custom'

我现在应该做什么?

为什么我收到此错误?

6 个答案:

答案 0 :(得分:2)

我认为你应该关注你的模块。在app / models / concerns中添加您的文件。

# app/models/concerns/query.rb
module Query
    extend ActiveSupport::Concern
    included do

        #you can use a scope
        scope :my_query, ->(just_a_param){ .... }
    end

    module ClassMethods
        #or a method
        def self.another_query
            where(....)
        end
    end
end

当然,您需要在模型中包含该模块。正如在rails中默认的那样,您不再需要更改配置自动加载路径。

答案 1 :(得分:0)

作为一种课堂方法,你需要自我。"

def self.custom my_query
  self.where(my_query) 
end

编辑:如果你想在所有ActiveRecord模型中使用它,你可以将它添加为初始化器

#config/initializers/active_record_extensions.rb

class ActiveRecord::Base

  def self.custom my_query
    self.where(my_query) 
  end

end

如果您只想在一个班级上学习,那么问题就会起作用。

答案 2 :(得分:0)

在您的示例中,您的类Users和您的方法自定义之间没有给出引用。首先:如果用户引用Ruby on Rails类,则可能称为User(另请参阅japed的注释)。所以改变电话。接下来,您的User类必须继承自ActiveRecord,否则它不会意识到'where'的存在。有关详细信息,请查看您的app / models / user.rb

那么Swards的建议应该适合你。停止应用程序并重新启动。现在应该可以了。

答案 3 :(得分:0)

伙计们我找到了真正的方法

首先,我的不当之处是我在模型中设置的包含 它应该是extend Query

然后它会运作良好

所以真正的代码将是

在此路径lib/query.rb

下创建方法文件

然后在其中设置此代码

module Query

  def custom my_query
    self.where(my_query)
  end

end

然后将此代码添加到此文件lib/application.rb

# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)

然后使用此命令

扩展模型中的方法
extend Query

并且在您的控制器查询中,您可以使用类似

的方法
def index
   @users= Users.custom(params[:query])
end 

答案 4 :(得分:0)

这是我的解决方案,不完全是'Rails方式',而是使用某种装饰模式:

@user = CustomQuery.find_for(User.find(params[:search])).perform!

class CustomQuery

  attr_reader :params, :klass

  def initialize(klass)
    @params = params
    @klass = klass
  end

  def self.find_for(params)
    CustomQuery.new(params)
    find_model_for(params.tap {})
  end

  def perform!
    return params unless params.nil?
    klass.all
  end

  def find_model_for(klass)
    @klass = klass    
  end

end

答案 5 :(得分:-4)

虽然我不确定创建全局方法的过程,但我可以说你的Ruby代码无效:

  def custom my_query
    self.where(my_query)
  end

需要:

  def custom (my_query)
    self.where(my_query)
  end