今天的家伙我正在尝试为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'
我现在应该做什么?
为什么我收到此错误?
答案 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