如何集成模块?

时间:2012-08-04 15:03:38

标签: ruby ruby-on-rails-3.2

更新:我改变了我的模型,但它仍然不起作用。我收到以下错误消息: ActionController :: RoutingError(未定义的局部变量或方法`stop_words_finder'用于#< Class:0x007facb57f6908>)

模型/ pool.rb

class Pool < ActiveRecord::Base

    include StopWords

    attr_accessible :fragment

  def self.delete_stop_words(data)
    words = data.scan(/\w+/)
    stop_words = stop_words_finder
    key_words = words.select { |word| !stop_words.include?(word) }

    pool_frag = Pool.create :fragment => key_words.join(' ')
  end
end

LIB / stop_words.rb

module StopWords
      def stop_words_finder
            %w{house}
      end
end

控制器/ tweets_controller.rb

class TweetsController < ApplicationController

  def index
    @tweets = Pool.all

    respond_with(@tweets)
  end
end

3 个答案:

答案 0 :(得分:0)

stop_words = :stop_words_finder

将符号:stop_words_finder指定给stop_words。您要做的是调用stop_words_finder中包含的Stopwords方法,该方法将返回数组。在这种情况下,您所要做的就是删除冒号。

stop_words = stop_words_finder

答案 1 :(得分:0)

将此添加到您的模型,以使stop_words_finder可用于Pool实例:

include StopWords

Pool.new.stop_words_finder将正常工作

要使stop_words_finder可用于Pool类,请使用extend:

extend StopWords

Pool.stop_words_finder可以使用。

另外,为什么你要在Pool类定义中创建一个Pool实例呢?

答案 2 :(得分:0)

您可以将模块包含在ApplicationController类中。这对Pool类完全没有影响。另外,在其定义中创建Pool类的实例是非常不正统的 - 您是否真的想在每次加载应用程序的代码时在数据库中创建一个新行?我会按照这些方式重构事情

class Pool < ActiveRecord::Base
  class << self
    include StopWords

    def create_from_data(data)
      words = data.scan(/\w+/)
      stop_words = stop_words_finder
      key_words = words.select { |word| !stop_words.include?(word) }

      pool = Pool.create :pooltext => key_words.join(' ')
    end
  end
end

然后,当您想要创建时,请致电Pool.create_from_data %q{Ich gehe heute schwimmen. Und du?}