Ruby on rails 为什么我的Rails插件中的函数在没有明确要求的情况下不能工作?

Ruby on rails 为什么我的Rails插件中的函数在没有明确要求的情况下不能工作?,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Ruby On Rails 3.2,我需要一些插件的帮助。我想用一个方法扩展ActiveRecord::Base,该方法初始化另一个可以在控制器中调用的方法 它将如下所示: class Article < ActiveRecord::Base robot_catch :title, :text ... end 因此,在控制器中,可以执行以下操作: class ArticlesController < ApplicationController ... def create

我需要一些插件的帮助。我想用一个方法扩展ActiveRecord::Base,该方法初始化另一个可以在控制器中调用的方法

它将如下所示:

class Article < ActiveRecord::Base
    robot_catch :title, :text
    ...
end
因此,在控制器中,可以执行以下操作:

class ArticlesController < ApplicationController
    ...
    def create
        @article = Article.new(params[:article])

        if @article.robot? params
            # Do not save this in database, but render
            # the page as if it would have succeeded
            ...
        end
    end
end
我的问题是,如果我是对的,robot_catch是类方法。此函数将在模型内调用,如上所示。我想知道我是否以正确的方式扩展了ActiveRecord::Base。机器人?函数无疑是一种实例方法

我使用的是Rails 3.2.22,我在另一个项目中安装了这个插件作为gem,我想在其中使用这个功能

现在,只有在我特别需要模型中的gem时,它才起作用。但是,我希望它的功能可以作为ActiveRecord::Base的一部分,而不需要它,否则我必须在我想要使用它的每个模型中都需要它,而不是特别枯燥。gem不应该自动加载到projectonrails启动中吗


编辑:也许回调可以解决这个问题,但我不知道如何使用它。这似乎有点晦涩。

首先,我建议你确定一下

如果是这样的话,您实际上需要的是一个自定义验证器

构建自定义验证器并不像看上去那么简单,您将构建的基本类将具有以下结构:

class SpecialValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    # Fill this with your validation logic
    # Add to record.errors if validation fails
  end
end
然后在您的模型中:

class Article < ActiveRecord::Base
  validates :title, :text, special: true 
end
我强烈建议你确保你想要的东西不是已经建成的,很可能是已经建成了。然后使用或继续执行自定义验证程序路线。

回答 我自己找到了解决办法。Bundler不会从我的项目使用的gemspec中自动加载依赖项,因此我必须在我的应用程序的lib/目录中的engine.rb文件中要求所有第三方gems才能加载gems。现在一切都正常运转


第二:robot_catch方法是一个类方法。

谢谢你的回答,但由于函数实际上不是验证器,很遗憾它没有回答我的问题。我为误解感到抱歉!我想我会给出这个例子,以便它以一种简化的方式勾勒出实际的问题。它可以帮助您包括您希望此代码产生的实际预期行为。也许有了这一点,你会更清楚地知道你想要这个代码做什么?不幸的是,我不能提出实际的问题,因为我仅限于合同。但这里所描述的问题接近现实。我现在对我的项目做了更具体的描述:-我明白了。我仍然认为验证器是最接近你想要的东西。否则,也许一个简单的模块就可以了?一个包含类和实例方法,用于AR模型。不管怎样,这看起来都是一个非常具体的问题,我希望你能找到一个合适的答案。
class Article < ActiveRecord::Base
  validates :title, :text, special: true 
end